c++中的字符串string
在c++中使用string类,必须在程序中包含头文件string #include<string>。
- 字符串初始化,将string对象声明为简单变量,而非数组,string类变量是一个表示字符串的实体,而char数组是一组用于存储字符串的char存储单元。
string str1; //定义一个空字符串对象
string str2 = "panther";//初始化一个字符串
- 赋值、拼接
string str2 = "panther";
string str1;
str1 = str2; //赋值
string str3;
str3 = str1+str2; //拼接
- string常用函数
str1.size();//字符串长度
以上内容来自《C++ primer》
C语言中字符char的使用
- C语言中使用字符数组来模拟字符串
- C语言中的字符串是以‘\0’结束的字符数组
- 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");
}
- 字符串中常见错误
- 子函数中定义的变量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);
}
- 字符串常量不能修改
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;
}
- 不要不断修改指针变量的值
char *a = (char *)malloc(50);
*a++ = i++;
free(a);
- 指针变量释放后要赋值不然会变成野指针
Main ()
{
char *p = str_cnct(“abcd”, “ddeee”);
if (p != NULL)
{
Free(p) ;
p = NULL;
}//释放之后要赋值为NULL不然会变成野指针
以上内容来自《传智播客C++课程讲义》
网友评论