【C语言】字符串与整型数值之间的转换
一.将字符串转化为对应的数值
/*============================================================================= # # FileName: stringToNo.c # Algorithm: 将字符串转化为对应的整型数值 # Author: Knife # Created: 2014-06-22 20:37:36 # =============================================================================*/ #include<stdio.h> #include<string.h> int atoi(char* s){ int i, n; n = 0; for(i = 0; s[i] >= '0' && s[i] <='9'; ++i){ n = 10 * n + (s[i] - '0'); } return n; } void main(){ char charArr[] = "4562"; int number = atoi(charArr); printf("%d\n",number); }
二.将数值转化成字符串
/*============================================================================= # # FileName: noToString.c # Algorithm: 将整型数值转化成字符串 # Author: Knife # Created: 2014-06-22 20:37:36 # =============================================================================*/ #include<stdio.h> #include<string.h> #define MAX 100 //字符串逆转 void reverse(char* charArr){ int j, k, tmp; j = 0; k = strlen(charArr)-1; for(; j < k; j++, k--){ tmp = charArr[j]; charArr[j] = charArr[k]; charArr[k] = tmp; } } void itoa(int n, char* charArr){ int tmpN, i, sign; i = 0; //判断是否为负数 if((sign = n) < 0){ n = - n; } //循环 while(n > 0){ tmpN = n % 10; n = n / 10; charArr[i++] = tmpN + '0'; } if(sign < 0){ charArr[i++] = '-'; } charArr[i] = '\0'; reverse(charArr); } void main(){ int n = -456; char charArr[MAX]; itoa(n, charArr); printf("%s\n", charArr); }
三.问题扩展
在数的对二的补码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-2^(字长-1)的情况,因为我们在(二)中的代码中判断如果n为负数,令n=-n,所以导致了溢出。修改该函数,使它在任何机器上运行时都能打印出正确的值。修改后的代码如下:
/*============================================================================= # # FileName: noToString2.c # Algorithm: 将整型数值转化成字符串(扩展版) # Author: Knife # Created: 2014-06-22 20:48:36 # =============================================================================*/ #include<stdio.h> #include<string.h> #include <stdlib.h> #define MAX 100 //字符串逆转 void reverse(char* charArr){ int j,k,tmp; j = 0; k = strlen(charArr)-1; for(; j < k; j++, k--){ tmp = charArr[j]; charArr[j] = charArr[k]; charArr[k] = tmp; } } void itoa(int n, char* charArr){ int tmpN, i, sign; i = 0; sign = n; //循环 do{ charArr[i++] = abs(n % 10) + '0'; }while (n /= 10); if(sign < 0){ charArr[i++] = '-'; } charArr[i] = '\0'; //字符串逆转 reverse(charArr); } void main(){ int n = INT_MIN; char charArr[MAX]; itoa(n, charArr); printf("%s\n", charArr); }