char* 与 char [] 的区别
char *a = "abcd"; 此时"abcd"存放在常量区。通过指针只可以访问字符串常量,而不可以改变它。(如果像char *a = "abcd",C++11已经会警告说“not allow conversion from string literal to char* ” 在 char前添加const即可消除警告,即 const char *a = "abcd")
char* a =new char[10]; //此时可以修改*a
而char a[20] = "abcd"; 此时 "abcd"存放在栈。可以通过指针去访问和修改数组内容。
所以
char* a = "abc"; //实质是const char* a="abc"
char b[20] = "123";
strcat(a , b); //错误,因为*a是在常量区,不可以修改
strcat(b , a);//正确,运行结果是 123abc
char* get_str(void)
{
char str[] = {"abcd"};
return str;
}
char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址。
此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的。
char* get_str(void)
{
char *str = {"abcd"};
return str;
}
char* str = {"abcd"};表示先定义个字符串常量,并将其地址赋给str。
此函数返回的是字符串常量的地址,而像这种字符串都是属于全局的,在编译的时候就已经分配了内存了,只有程序退出的时候才会被销毁,所以返回它的地址是没有问题的,但是你最好返回常量指针,因为你不能去改变字符串常量的值。
数组和指针是不同的数据类型,有本质的区别:
char str[] = "abcd"; //sizeof(str) == 5 * sizeof(char)
char * str = "abcd"; //sizeof(str) == 4(x86) or 8(x64)
数组可以自动转型成指针,指针不能转成数组。
string转换为 char 数组字符串
法1. const char* b = string.c_str() ;
法2. char b[2];
strcpy(b , string.c_str() ) ;
字符串的输入
(1)方法一:使用输入操符来填充一个C字符串变量
例如:
char a[80];
cin>>a;
注:以这种方式来读取C字符串时,会忽略最初的空白字符(空格、制表符和换行符),而且输入会在下一个空格或者换行符处停止。(string字符串也是同理)
(2)方法二:使用预定义函数getline获取整行输入(包括空格)
getline函数有两个参数:第一个参数用于接收输入的C字符串变量;第二个参数用于规定getline最多能接收的字符个数( 还有一个位置是给结束标志位的 )。
例如:
char a[80];
cin.getline(a,80);
当遇到行结束的时候,输入才会停止。
字符串到数字的转换
atoi函数获取一个C字符串参数,返回对应的int值。如果参数不与一个int值对应,atoi就会返回0。atoi函数在文件为cstdlib的库中。如果数字太大,不能转换成int类型的值,可以使用atol将字符串转换为long类型的值。
例如:
atoi("1234"); //返回整数1234
atoi("#123"); //返回0