c/c++语言 字符串转ASCII码

340 阅读2分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

首先我们要实现一个将由单引号扩住的字符串变为int整型的from_str方法,再此之前的先实现substring方法来筛选字符串段落。

实现from_str()将连接后的字符转为int整型

int strLen(const char*s){const char*e=s;while(*s!='\0')++s;return s-e;}
static char ASCII[97]= " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
char*substring(const char*c,int i,int e){
  char *w=(char*)malloc(sizeof(char)*(e-i));int p = 0;for(;i<e;)w[p++]=c[i++];w[p]='\0';return w;
}
int from_str(const char*oid){//传入字符串oid
  int this=0,i=strLen(oid),j,pow_256=1;
  while (i-->0){//循环oid的每一位赋值给chr
    char*chr=substring(oid,i,i+1);j=0;
    while (j++<97){//循环chars的每一位看看有没有跟chr一样的
      char*s=substring(ASCII,j-1,j);
      if(strcmp(chr,s)==0){
        this=this+(j+31)*pow_256;
        pow_256=pow_256*256;free(s);break;//找到一样的立马弹出当前累积的ascii
      }
      free(s);
    }
    free(chr);//用完了释放指针内存
  }
  return this;
}

实践switch字符串的方式

#define toasc(c) (((unsigned char)(c))&0x7f)
//上面的方法只能放进去一个char字符,并不能把char字符组全部转换成int
//下面的方法是上面的反方法,将ASCII码也就int类型转换成单字符的方法
unsigned char * cc = (unsigned char *)100;//此时cc是'd',小写字母d
  
//将char字符集转换成数字
int from_str(const char*s){
  int r=0;for(int i=0;s[i]!='\0';r*=256,r+=s[i++]);return r;
}
//逆向数字变回字符集的方法
static char ASCII[97]= " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
char*to_str(int i){
  int t=i/0x100,b=i-t*0x100-32,z=i>8355711?5:i>32639?4:i>127?3:2;
  char*w=(char*)malloc(sizeof(char)*z);w[--z]='\0';
  while(t>127){
    w[--z]=ASCII[b];i=t;t=i/0x100;b=i-t*0x100-32;
  }
  w[--z]=ASCII[b];if(z>0){t-=32;w[0]=ASCII[t];}
  return w;
}
//判断的时候case里面用单引号,那样字符就会是ASCII码,也就int类型。
char c[5];scanf("%s",&c);
switch (from_str(c)){
  case 'wwzz':
  printf("%s\n",to_str(from_str("wwzz")));
  break;
  case 'hook':/* 比方说当c是'hook'的时候,在此处写逻辑 */
  break;
  default:break;
  }
  //这样就完美解决了switch结构放不进字符串变量的问题

实践题目:剪刀石头布(要求使用ascii码来判定)

输入 ​ 输入两个字符 a,b 分别表示小明和李华所出手势。′′O′′,′′Y′′,′′H′′ 分别表示石头剪刀布。

输出 ​ 如果小明赢了则输出 MING,如果李华赢了则输出 LI 如果平局则输出 TIE。

完整代码如下:

#include<stdio.h>
#include<string.h>
int strLen(const char*s){const char*e=s;while(*s!='\0')++s;return s-e;}
static char ASCII[97]= " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
char*substring(const char*c,int i,int e){
  char *w=(char*)malloc(sizeof(char)*(e-i));int p = 0;for(;i<e;)w[p++]=c[i++];w[p]='\0';return w;
}
int from_str(const char*oid){
  int this=0,i=strLen(oid),j,pow_256=1;
  while (i-->0){
    char*chr=substring(oid,i,i+1);j=0;
    while (j++<97){
      char*s=substring(ASCII,j-1,j);
      if(strcmp(chr,s)==0){
        this=this+(j+31)*pow_256;
        pow_256=pow_256*256;free(s);break;
      }
      free(s);
    }
    free(chr);
  }
  return this;
}
int main(){char a[2],b[2],c[4];int f;
  scanf("%s %s",&a,&b);//先读入出的剪刀石头布的大写字母表示
  sprintf(c,"%s%s",a,b);//连接这两个大写字母并存入c中
  switch (from_str(c)){//使用from_str将连接后的字符转为int整型
  case 'HO':f=2;break;
  case 'OH':f=1;break;
  case 'OY':f=2;break;
  case 'YO':f=1;break;
  case 'YH':f=2;break;
  case 'HY':f=1;break;
  default:f=0;break;
  }
  printf(f==2?"MING":f==1?"LI":"TIE");
}

优化的代码解决,来自一位热心匿名群友的代码方案


int from_str(const char*s){
  int r=0;for(int i=0;s[i]!='\0';r*=256,r+=s[i++]);return r;
}

printf("0x%02x\n",from_str("wwzz"));//打印十六进制ASCII
printf("%d\n",from_str("hook"));//打印十进制ASCII

温馨提示:单引号中最多只能容纳4个,再多了就会出现字符串常量过大的问题