c++ -- c风格字符串,以及c++通过c_str()方法与c风格字符串的转换


1. C/C++中每个字符串都以'\0'作为结尾,这样我们就能很方便找到字符串的最后结尾。

1 char str[10];
2 strcpy(str,"0123456789");   //错误:数组越界。"0123456789"的实际长度为11个字节

注意:谨记字符串末尾的空字符,防止数组越界

2. C/C++把常量字符串放到单独的一个内存区域

  为了节省内存,C/C++把常量字符串单独放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。但用常量内存初始化数组,情况却有所不同

 1 int main(int argc,char *argv[])
 2 {
 3     char str1[]="hello world";  //字符数组
 4     char str2[]="hello world";  
 5 
 6     char *str3="hello world";  //字符指针
 7     char *str4="hello world";
 8 
 9     if(str1==str2)
10         cout<<"str1 and str2 are same\n";
11     else
12         cout<<"str1 and str2 are not same\n";
13 
14     if(str3==str4)
15         cout<<"str3 and str4 are same\m";
16     else
17         cout<<"str3 and str4 are not same\n";
18 
19     return 0;
20 }
21 //输出:
22 //str1 and str2 are not same
23 //str3 and str4 are same

3. 字符指针与字符数组的区别

3.1 字符指针可以指向一个字符串,字符数组可以存放一个字符串。

  我们可以用字符串常量字符指针进行初始化。如下面代码第1行是对字符指针进行初始化,此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址

  这里要注意字符指针字符数组之间的区别。如下面代码第2行,此时,string是字符数组,它存放了一个字符串

  字符指针str与字符数组string的区别是:str是一个变量可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,可以改变数组中保存的内容。

 1 char *str, *str1="This is another string";   //字符指针
 2 char string[100]="This is a string";   //字符数组
 3 
 4 //程序中,可以使用如下语句:
 5 str++;    /* 指针str加1 */
 6 str = "This is a NEW string.";    /* 使指针指向新的字符串常量 */
 7 str = str1;    /* 改变指针str的指向 */
 8 strcpy( string, "This is a NEW string.")    /* 改变字符串的的内容 */
 9 strcat( string, str)    /* 进行串连接操作 */
10 
11 //在程序中,不能进行如下操作:
12 string++;    /* 不能对数组名进行++运算 */
13 string = "This is a NEW string";    /* 错误的串操作 */
14 string = str1;    /* 对数组名不能进行赋值 */
15 str[0]='I'; //不能改变str所指的字符串常量
16 strcat(str, "This is a NEW string") /* 不能在str的后面进行串连接 */ 17 strcpy(str, string) /* 不能向str进行串复制 */

 

4.c风格字符串可以使用cout和cin作整体输入输出,但是,其他整体操作,如赋值比较连接都是不允许的。

//C提供的声明字符串的方法
char str[]={'I',' ','L','O','V','E',' ','C','+','+','\0'};  
//C++提供的声明C风格字符串的方法--使用字符串常量
char x[10],y[11]="I LOVE C++";    //会默认在最后添加空字符'\0',要多申请1内存
x="123456789";   //错误
x=y;                    //错误
if(x<y)                 //错误
{
    ....    
}
x+=y;                  //错误
char *str="I LOVE C++"; //错误,字符指针
和普通数组一样,原则上,必须逐个对字符串中的元素进行操作,但为了方便对“C风格字符串”进行处理,系统提供了相应的库函数来完成这些操作。
标准头文件<cstring>(旧标准中为<string.h>),提供了很多相关函数的声明,常用的字符串处理函数如下:
size_t strlen(数组名); //取得C风格字符串长度
char* strcpy(目标数组名,源数组名); //复制...
int strcmp(数组名1,数组名2); //比较是否相等,相等返回0;1<2,返回负数;1>2,返回正数
char* strupr(数组名); //小写转大写
char* strcat(数组名1,数组名2); //在数组1后接上数组2

5.因为在c语言中没有string类型,为了与c语言兼容,故C++为string类对象成员提供了c_str()成员,可以通过c_str()把string 对象转换成c中的字符串样式

c_str()语法: const char *c_str(); c_str()函数返回一个指向C类型字符串的指针常量, 内容与原string串相同. 注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 不能这样: char* c; string s="I LOVE C++";
//因为s对象被析构,c最后指向的内容是不存在的,其内容会被处理。另外,将一个const char *赋与一个char *,编译器也将报错。 c = s.c_str();
应该这样用: char c[20]; //申请一块内存 string s="I LOVE C++"; strcpy(c,s.c_str()); //采用strcpy()函数操作 这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作。 再举个例子 c_str() 以 char* 形式传回 string 内含字符串 如果一个函数要求char*参数,可以使用c_str()方法: string s = "Hello World!"; printf("%s", s.c_str()); //输出 "Hello World!"
posted @ 2017-06-03 16:42  halo_vagabond  阅读(489)  评论(0编辑  收藏  举报