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

2020-05-19  本文已影响0人  潘雪雯

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的使用

  1. C语言中的字符串是以‘\0’结束的字符数组
  2. C语言中的字符串可以分配于栈空间、堆空间或只读存储区
char buf1[] ={'a','b','c','d','\0'};
char buf2[] = {"abcde"};
char buf3[] = "abcde";
char buf4[100] = "abcde";
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++课程讲义》

上一篇下一篇

猜你喜欢

热点阅读