本文已参与「新人创作礼」活动.一起开启掘金创作之路。
让8位字符与数字互转,但因编译器的限制,switch里面单引号中只能放进8个字符, 同时也可以把这8个字符转换为数字,或者数字转回去字符。
下面是一个测试样例的代码
#include<stdio.h>
#include<string.h>
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 strLen(const char*s){const char*e=s;while(*s!='\0')++s;return s-e;}
unsigned long long from_str(const char*oid){int i=strLen(oid),j;
unsigned long long this=0,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;
}
char*to_str(unsigned long long i){
int z=2;for(unsigned long long a=i;a>127;a-=127,a/=256,++z);
unsigned long long b,t=i/0x100;b=i-t*0x100-32;
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;
}
unsigned long long fromStr(const char*s){
unsigned long long r=0;for(int i=0;s[i]!='\0';r*=256,r+=s[i++]);return r;
}
int main(){
char d[9];scanf("%s",&d);
printf("%lld\n",from_str(d));
printf("str->%s\n",to_str(fromStr(d)));
return 0;
}