| ?1.字符串的逆序输出c语言把字符串逆转看起来是一件非常简单的事情,就如同把数组逆序一样,本质上字符串就是一个char类型的数组,但是其中有不少的细节值得注意。?  
 #include<stdio.h> #include<string.h> //参数char *str? 不用const void reverse(char *str){//不同于数组,不需要传递长度 ? ? ? ? size_t len = strlen(str);//长度 ? ? ? ? size_t?i;//size_t可以理解为 unsiged int ,使用size_t可能会提高代码的可移植性、有效性或者可读性。 ? ? ? ? for(i=0;i<len/2;i++){ ? ? ? ? ? ? ? ? char temp; ? ? ? ? ? ? ? ? temp = *(str+i);//当然你也可以使用中括号的形式。 ? ? ? ? ? ? ? ? *(str+i) = *(str+len-i-1); ? ? ? ? ? ? ? ? *(str+len-i-1) = temp; ????????} }? ok,函数已经写好了,只需要输入一个字符串即可调用。但大多数人都会直接用双引号(char *str = "Hello world!")这是字面值的定义存储在字面值常量区只读空间无法进行修改。  
 //主函数 int main(){ ? ? ? ? char str[20]? = “Hello world!”; ? ? ? ? reverse(str); ? ? ? ? puts(str);//也可以用for循环逐个输出 } 2.?int 转化为字符串类型这个问题在c语言当中char的类型本质上就是int类型来存储的,下面这段代码就很好的说明问题。  
 #include<stdio.h> int main(){? ? ? ? int i = 97;
 ? ? ? ? char c = 'a';
 ? ? ? ? printf("int i_d = %d\n",i);
 ? ? ? ? printf("int i_c = %c\n",i);
 ? ? ? ? printf("char c_d = %d\n",c);
 ? ? ? ? printf("char c_c = %c\n",c);
 ? ? ? ? return 0;
 }
 ?那么要把int 转化成字符串,无非就是将每一位放到字符串数组中去。但是输入的整数的正负号是一个要好好思考的点。  
 void int2str(int num,char *str){ ? ? ? ? int flag = num>0?1:-1;//判断正负 ? ? ? ? num = num*flag;//相当于取绝对值的过程,全部转化成正数处理。 ? ? ? ? int i=0; ? ? ? ? while(num){ ? ? ? ? ????????str[i++] = num%10+'0';//转化为int进行运算 ????????????????//很显然这个结果是逆序的,那我们上面所作的字符串逆序就派上用场了 ? ? ? ? ????????num/=10; ? ? ? ? } ? ? ? ? if(flag==-1){ ? ? ? ? ? ? ? ? str[i++] = '-'; //字符串长度要多预留1。 ????????} ? ? ? ? str[i] = '\0'; ? ? ? ? reverse(str); } ?3.字符串转int有了int转字符串的经验,字符串转int应该能够得心应手。其中任然要注意正负号的问题,以及读取字符串结束的标志为读到‘\0’。  
 void str2int(char *str,int *num){// 你要改变主函数中的整数,应该操作该数的地址 ? ? ? ? assert(str!=NULL);// 断言这个字符串不为空。 ????????int flag; ? ? ? ? flag = *str=='-' ? 1:-1;? ? ? ? ? str?= (*str=='-' || *str=='+')? ++str:str; ? ? ? ? int n = 0; ? ? ? ? while(*str){ ? ? ? ? ? ? ? ? assert(*str>='0' && *str<='9'); ? ? ? ? ? ? ? ? n = 10*n + (*str-'0'); ? ? ? ? ? ? ? ? ++s;? ????????} ? ? ? ? n*=flag;//正负问题 ? ? ? ? *num = n; } 4.字符串转化为double类型这个问题无非就是如何处理小数点的问题,但是精度问题没法解决。  
 void str2double?(const char *str,double *num){ ? ? ? ? assert(*str!=NULL); ????????int flag; ? ? ? ? flag = *str=='-' ? 1:-1;? ? ? ? ? str?= (*str=='-' || *str=='+')? ++str:str; ? ? ? ? int doit = 0;//判断出现过小数点没 ? ? ? ? double?n = 0; ????????assert(*s!='\0'); ? ? ? ? double?m = 10; ? ? ? ? while(*str){ ? ? ? ? ? ? ? ? if(*str=='.'){ ????????????????????????? ? ?++diot; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?assert(diot<=1); ????????????????}else{ ? ? ? ? ? ? ? ? ? ? ? ? assert(*str>='0' && *str<='9'); ? ? ? ? ? ? ? ? ? ? ? ? if (idot){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? n = n+(*s-'0')/m; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? m*=10; ????????????????????????}else{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? n = n*10 +(*s - '0'); ????????????????????????}? ? ?? ????????????????} ? ? ? ? ? ? ? ? ++s; ????????} ? ? ? ? n*=flag;//正负问题 ? ? ? ? *num = n; } |