字串轉換成整型,字串轉換整型
題目:將字串轉換成整型,比如輸入“123”,輸出123。
解題思路:
利用每一個0-9數字字元對應的Ascii減去48就得到了一個0-9的整型數字。用前i-1位表示的整型數字乘以10加上第i位表示的數字,就可以得到轉換成的整型了。注意字串第1個字元也可以是+或-。當字串第1個字元是-時,用前i-1位表示的整型數字乘以10減去第i位表示的數字,就可以得到轉換成的整型了。這樣的話,還可以適用前面的數字有0的情況。比如輸入“-0123”,輸出-123。另外還有一個需要注意的地方就是溢出:字串轉換成的整型不能超過整型可以表示數位範圍。
int strToInt(char str[]){ int max = (1<<30)-1+(1<<30);//32位系統整型可以表示的最大數,之所以不直接用(1<<31)-1是因為在1<<31時整型溢出了,雖然只會報一個警告int min=(-1<<31);//32位系統整型可以表示的最小數int number=0;//number表示字串轉換成的整型,當無法轉換時,會提醒並返回0if(str==NULL)//字串為空白時{printf("該字串為空白,無法轉換成整型");return 0;}int n=0;while(str[n]!='\0')//遍曆看字串中是否有非法字元{if(n==0)//字串中第1個字元可以是0-9的數字或+或-{if((str[n]>=48&&str[n]<=57)||str[n]=='+'||str[n]=='-'){}else {printf("該字串無法轉換成整型");return 0;}}else //字串除第1個字元外,其他字元都必須是0-9{if(str[n]>57||str[n]<48){printf("該字串無法轉換成整型");return 0;}}n++;}if(str[0]=='\0')//字串為空白串時{printf("該字串為空白串,無法轉換成整型");return 0;}else if(str[0]=='+')//字串第一個字元是+時{int i=1;while(str[i]!='\0'){ //判斷所轉換成的整型數字是否會溢出if(number>max/10){printf("該字串轉換成整型會溢出,無法轉換成整型");return 0;}else if(number==max/10){if(str[i]-48>max%10){printf("該字串轉換成整型會溢出,無法轉換成整型");return 0;}}number=10*number+(str[i]-48);i++;}return number;}else if(str[0]=='-'){int i=1;while(str[i]!='\0'){ //判斷所轉換成的整型數字是否會溢出if(number<min/10){printf("該字串轉換成整型會溢出,無法轉換成整型");return 0;}else if(number==min/10){if(-(str[i]-48)<min%10){printf("該字串轉換成整型會溢出,無法轉換成整型");return 0;}}number=10*number-(str[i]-48);i++;}return number;}else{int i=0;while(str[i]!='\0'){ //判斷所轉換成的整型數字是否會溢出if(number>max/10){printf("該字串轉換成整型會溢出,無法轉換成整型");return 0;}else if(number==max/10){if(str[i]-48>max%10){printf("該字串轉換成整型會溢出,無法轉換成整型");return 0;}}number=10*number+(str[i]-48);i++;}return number;}}