//==================================================================// 面试题67:把字符串转换成整数// 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,// 不能使用atoi或者其他类似的库函数。#include<stdio.h>#include<stdlib.h>#include<stdbool.h>enumStatus{
Valid =0,
Invalid
};//全局变量int g_Status = Valid;//表示输入的字符串是否可以转成数字,0表示成功,1表示无效。//函数声明longlongStrToIntCore(constchar* str,int SignFlag);//字符串转数字intStrToInt(constchar* str){
g_Status = Invalid;//初始化为1,表示未转成功。longlong num =0;//返回值if(str !=NULL&&*str !='\0'){int SignFlag =1;//1:表示正数,0表示负数if(*str =='+')
str++;elseif(*str =='-'){
str++;
SignFlag =0;}if(*str !='\0')//输入字符串不是“+”或者“-”时{
num =StrToIntCore(str, SignFlag);}}return(int)num;}longlongStrToIntCore(constchar*digit,int SignFlag){longlong num =0;while(*digit !='\0'){if(*digit >='0'&&*digit <='9'){int flag =(SignFlag ==0)?-1:1;
num = num *10+ flag *((longlong)*digit -'0');if(((SignFlag ==1)&&(num >0x7FFFFFFF))||((SignFlag ==0)&&(num <(signedint)0x80000000))){
num =0;break;}
digit++;}else{
num =0;break;}}if(*digit =='\0'){
g_Status = Valid;}return num;}// ====================测试代码====================voidTest(constchar*string){int result =StrToInt(string);if(result ==0&& g_Status == Invalid)printf("the input %s is invalid.\n", string);elseprintf("number for %s is: %d.\n", string, result);}intmain(int argc,char* argv[]){Test(NULL);//the input (null) is invalid.Test("");//the input is invalid.Test("+");//the input + is invalid.Test("-");//the input - is invalid.Test("1a33");//the input 1a33 is invalid.Test("123");//number for 123 is: 123.Test("+123");//number for +123 is: 123.Test("-123");//number for - 123 is: -123.Test("+0");//number for +0 is: 0.Test("-0");//number for -0 is: 0.//有效的最大正整数, 0x7FFFFFFF,可能存在上溢出Test("+2147483647");//number for + 2147483647 is: 2147483647.Test("+2147483648");//the input + 2147483648 is invalid. //有效的最小负整数, 0x80000000,可能存在下溢出Test("-2147483648");//number for - 2147483648 is : -2147483648.Test("-2147483649");//the input - 2147483649 is invalid. return0;}
/*方法1:通过加减法*/int a =6;int b =3;
a = a + b;//9
b = a - b;//6
a = a -b;//3/*方法2:通过位或运算*/int a =6;int b =3;
a = a ^ b;//5
b = a ^ b;//6
a = a ^ b;//3 //一个数与另一个不相等的数进行异或2次,就可以成本身:A^B^B = A(A!=B)