zoukankan      html  css  js  c++  java
  • c++ -- c风格字符串,以及c++通过c_str()方法与c风格字符串的转换

    
    

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

    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
    ";
    11     else
    12         cout<<"str1 and str2 are not same
    ";
    13 
    14     if(str3==str4)
    15         cout<<"str3 and str4 are samem";
    16     else
    17         cout<<"str3 and str4 are not same
    ";
    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','+','+',''};  
    //C++提供的声明C风格字符串的方法--使用字符串常量
    char x[10],y[11]="I LOVE C++";    //会默认在最后添加空字符'',要多申请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!"
  • 相关阅读:
    [AngularJS] Html ngSanitize, $sce
    [AngularJS] ngModelController render function
    [MODX] 3. Placeholder +
    [MODX] 2. Chunks $
    HTTP-Runoob:HTPP Content-Type
    HTTP-Runoob:HTTP状态码
    HTTP-Runoob:HTTP请求头信息
    HTTP-Runoob:HTTP请求方法
    HTTP-Runoob:HTPP消息结构
    HTTP-Runoob:HTTP简介
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/6937723.html
Copyright © 2011-2022 走看看