一、整数与字符串之间的相互转换 1.将字符串转换成整数
例如有一字符串str[]=“1234”,最直观的转换方法就是依次将每一个字符转换成相应的数字,然后乘10累加,即((1*10+2)*10+3)*10+4。想要得到每一位相应的数字,只需用每个字符减去数字0的ASCII码,即2= str[1]-'0'。 如果字符串首字符标示的是一个负数,即str[0]=='-'。那么此时应该设置一个符号判断标示位(用来判断以后得到的整数是否需要乘-1),并把要处理的字符数组下标设置为1。 int str_to_int(char str[]) { int i=0, isNeg=0,num=0; if(str[0]=='-') {isNeg=1; i=1; } while(str[i]) {num=num*10+(str[i]-'0'); i++; } if(isNeg) num*=-1; return num; }
2.将整数转换为字符串 将整数转换为字符串相对要复杂些。通过取模,并结合商与余数的关系,可以有几种方法。例如,123除以100,商为1,余数为23,这样,首先可以把“1”保存到字符串里。然后23除以10,商为2,余数为3。这样就可以得到字符串“123”了。但是,怎样来确定整数的位数确实比较麻烦。有一种相对简单的方法。 首先将123除10取模,得到数字3,此时商为12。再将12除10取模,得到数字2,商为1。这样,我们可以得到字符串“321”,接着进行一次逆序即可得到想要的字符串。 同样,如果该整数小于0,我们需要人为地将其变成正数,再进行取模运算!! char int_to_str(int num,char str[]) { int i=0,j=0,isneg=0; char temp[10]; if(num<0) { num*=-1; isNeg=1; } do{ temp[i]=(num)+'0'; num/=10; i++; }while(num) //使用do-while结构保证当num为0时也执行循环。 if(isNeg) temp[i++]='-'; while(i>0) str[j++]=temp[--i]; str[j]='\0'; //字符串结束符不能忘掉。 }
二、传递动态内存 What will happen after running the "Tests"? 1. #include<iostream> void GetMemory(char *p, int num) { p=(char *)malloc(sizeof(char)*num); } int main() { char *str=NULL; GetMemory(str,100); strcpy(str,"hello"); return 0; } 程序崩溃。毛病出在函数GetMemory中。该函数中的参数*p实际上是主函数中str的一个副本,编译器总是要为函数的每个参数做临时副本。在本程序段中,p申请了新的内存,只是把p所指向的内存地址改变了,但是str丝毫未变。因为函数GetMemory没有返回值,因此str并不指向p所申请的那段内存,所以函数GetMemory并不输出任何东西。事实上,每执行一次GetMemory就会申请一块内存,但是申请的内存却不能得到有效地释放,结果是内存一直被占用,最终造成内存泄露。 修改方法有2种。(1)我们可以用函数的返回值来传递动态内存,把GetMemory函数的返回类型改为指针类型即可。 char *GetMemory(char *p, int num) { p=(char *)malloc(sizeof(char)*num); return p; } (2)如果一定要用指针参数去申请内存,那么应该采用指向指针的指针,传str的地址给函数GetMemory。 void GetMemory(char **p, int num) { *p=(char *)malloc(sizeof(char)*num); } int main() { char *str=NULL; GetMemory(&str,100); strcpy(str,"hello"); return 0; }
2.#include <iostream> using namespace std; char *GetMemory(void) { char p[]="hello"; return p; } int main() { char *str=NULL; str=GetMemory(); cout<<str; return 0; } 这段代码的错误就显而易见了。因为函数GetMemory返回的是一个指向“栈内存”的指针,当调用函数结束后,该指针的地址不是NULL,但是原来的内容已经被清楚,新内容不可知。所以,程序输出的可能是乱码,也有可能正常输出。
三、字符指针 What will happen after running the "Tests"? #include <iostream> using namespace std; int main() { char *str="hello,every one!"; strcpy(str,"hello,world"); cout<<str; } 这段代码的迷惑性是很强的。程序直接使用字符指针来初始化字符串。在C++中,用双引号括起来的字符串被规定为const类型!这样,意味着str也隐含地被设置为const类型,指向的是全局的const内存区。所以,程序无法通过strcpy试图修改str字符串的内容。