c++中的字符串string和C语言中的字符char

c++中的字符串string

在c++中使用string类,必须在程序中包含头文件string #include<string>

  1. 字符串初始化,将string对象声明为简单变量,而非数组,string类变量是一个表示字符串的实体,而char数组是一组用于存储字符串的char存储单元。
string str1; //定义一个空字符串对象
string str2 = "panther";//初始化一个字符串
  1. 赋值、拼接
string str2 = "panther";
string str1;
str1 = str2; //赋值
string str3;
str3 = str1+str2; //拼接
  1. string常用函数
str1.size();//字符串长度

以上内容来自《C++ primer》

C语言中字符char的使用

  • C语言中使用字符数组来模拟字符串
  1. C语言中的字符串是以‘\0’结束的字符数组
  2. C语言中的字符串可以分配于栈空间、堆空间或只读存储区
  • 字符串的初始化
    大括号法初始化列表
char buf1[] ={'a','b','c','d','\0'};
char buf2[] = {"abcde"};
char buf3[] = "abcde";
char buf4[100] = "abcde";
  • 字符串的长度
    strlen()求字符串的长度,注意字符串的长度不包含\0
    sizeof()求字符串的长度,注意字符串的长度包含\0
void main()
{
    char buf1[] = "abcdef,acccd,eeee,aaaa,e3eeeee,sssss";
    cout << strlen(buf2) << endl ;
        cout << sizeof(buf3) << endl;      
 } 
image.png
  • 数组法和指针法操作字符串
for(i = 0;i<100;i++)
{
    cout << buf1[i] ;
}      
cout << endl;
    
for(i = 0;i<100;i++)
{
    cout << *(buf1+i));
}      
cout << endl;
从内存四区理解一级指针内存模型
  • 字符串做函数参数
    四种字符串拷贝函数
//用字符串初始化字符数组 
//strlen() 长度 不包括0
///sizeof() 内存块的大小 
int main2()
{
    char a[] = "i am a student";
    char b[64];
    //把字符串a拷贝到buf
    int i =0;
    for(i=0;*(a+i)!='\0';i++)
    {
       *(b+i) = *(a+i); 
    } 
    //0没有copy到b的buf中
    b[i] = '\0';
    printf("a:%s \n",a);
    printf("b:%s \n",b); 
    printf("hello...\n");
 } 
 
 //字符串copy函数技术推演
 //完成字符串拷贝工作,
 void copy_str21(char *from,char *to)
 {
    for( ; *from!='\0'; from++,to++)
    {
       *to = *from; 
    }
    
    *to = '\0';
     
  } 
  
  //*p操作和++的操作谁的优先级高 
  // ++ 优先级高 
  void copy_str22(char *from,char *to)
 {
    for( ; *from!='\0';)
    {
       *to++ = *from++; //先执行*to = *from 再执行 to++ 和from ++ 
    }
    
    *to = '\0';
     
  } 
  
 void copy_str23(char *from,char *to)
 {
    while((*to = *from) !='\0')
    {
        from++;
        to++;
    }
  }
  
 int main()
 {
    char *from="abcd";
    char buf2[100];
    copy_str22(from,buf2);
    printf("buf2:%s \n",buf2);
    printf("hello...\n"); 
} 
  • 字符串中常见错误
  1. 子函数中定义的变量z是临时分配的内存空间,在子函数结束时销毁,并不能返回。
char *str_cnct(char *x, char* y)     /*简化算法*/
{
    char str3[80];
    char *z=str3;   /*指针z指向数组str3*/ 
    while(*z++=*x++);
    z--;                   /*去掉串尾结束标志*/
    while(*z++=*y++);
    z=str3;      /*将str3地址赋给指针变量z*/
    return(z);
}
  1. 字符串常量不能修改
Char *p = “abcdefg”;
Modify p[1] = ‘1’;

给出亲身经历的案例,希望大家参考。当时面某公司时给出一道题是这样的

4,排序题, 把下面的字符串里的字符按ASCII码从小到大排列.
char *str = "54321abCdEf";
代码:

当时没想那么多,感觉就是简单的排序吧,直接拿去做了。结果后面一直没有调试成功,事后才发现面试官给的题目中有坑。当指针指向常量字符串时不能修改字符串的值

int main()
{
    char str[] = "54321abCdEf";
       // char *str = "54321abCdEf"; 错误的方式
    char t = 0;
    int strLen = strlen(str);
    cout << strLen << endl;
    for(int i = 1;i<strLen ;i++)
    {
        for(int j = 0;j<strLen-i;++j)
        {
            if(str[j+1] < str[j])
            {
                t        = str[j];
                str[j]   = str[j+1];
                str[j+1] = t;
            }
        }
    }
    
    for(int i = 0;i<strLen;i++)
    {
        cout << str[i] << " ";
    }
    cout << endl;
    return 0;
}
  1. 不要不断修改指针变量的值
char *a = (char *)malloc(50);
*a++ = i++;
free(a);
  1. 指针变量释放后要赋值不然会变成野指针
Main ()
{
    char *p = str_cnct(“abcd”, “ddeee”);
    if (p != NULL) 
    {
        Free(p) ;
        p = NULL;
}//释放之后要赋值为NULL不然会变成野指针

以上内容来自《传智播客C++课程讲义》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359