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!"

转载于:https://www.cnblogs.com/cygalaxy/p/6937723.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值