C风格字符串
- C风格字符串并不是一种类型,它指的是一种编程习惯,指C语言中以'\0'结尾的字符串。
- C语言中没有字符串类型,通常用字符串数组来存放一个字符串;可以直接将一个字符串直接量(字面量)直接赋值给数组(可以定义长度也可以不指定),编译器会在字符数组末尾自动的添加'\0'作为串的结束符。
- 用字符串给字符数组赋值时由于要添加结束符'\0',数组的长度要比字符串的长度大1.
- puts和printf在输出字符串时会逐个扫描字符,直到遇见'\0'才结束。
- C语言中字符串定义方式有两种:char *s或者char s[],都属于C风格字符串,其区别是char *s定义的字符串直接量保存在内存的数据段中且不可更改,字符数组保存在栈内存中。
//例:以下程序会报错,因为Danny保存在内存数据段中,不可更改。
char *src = "Danny";
const char *addition = "Andy";
strcat(src, addition);
//正确形式
char src[20] = "Danny";
const char *addition = "Andy";
strcat(src, addition);
注意:C风格字符串以'\0’结尾,头文件cstring和string.h中定义的函数strlen、strcat等函数操作的对象是C风格字符串。
C风格字符串和string的相关操作
-
C风格字符串与string字符串直接的转换
//C风格字符串转string:直接赋值
char *ch1="123456";
string str=ch1;//直接赋值即可
cout<<str<<endl;
char ch[]="ldkk";
string st=ch;//直接赋值
//string转C风格字符串:两种方式c_str() data()
string str2="gsghd";
const char *s=str2.c_str();//.c_str()返回字符串常量
printf("%s\n",s);
const char *cs=str2.data();
printf("%s\n",cs);
-
C风格字符以及string字符串输入输出以及遍历方式
//c字符数组输入方式:
char ch[100];
//scanf("%s",ch);//c字符串输入方式
//printf("%s\n",ch);
char *ch2;
//scanf("%s",ch2);报错,ch2未被初始化指向不明
//ch2=(char *)malloc(sizeof(char));
//scanf("%s",ch2);//已经分配好空间
gets(ch);
printf("%s\n",ch);
//数组遍历:需要获取长度,使用函数strlen
int len=strlen(ch);
for(int i=0;i<len;i++){
printf("%c\n",ch[i]);
}
-
C风格字符串与string的循环连拼接方式(包括与数字直接的拼接)
//字符串拼接
//c风格字符串拼接strcat
char ch[100]="";
for(int i=0;i<10;i++){
strcat(ch,"1");
}
printf("%s\n",ch);
//使用sprintf
char s[100];
for(int i=0;i<2;i++){
sprintf(s,"%s%d",ch,0);
strcpy(ch,s);
}
printf("%s\n",s);
//string拼接
string str1="skkk";
stringstream ss;
ss<<str1;
for(int i=0;i<5;i++){
ss<<0;
}
cout<<ss.str()<<endl;
//c11 语法
//to_string方法会导致多重定义问题,adding #define __USE_MINGW_ANSI_STDIO 0 to the start
//of the code,before any includes, which disables the definition of vsnprintf in
//stdio.h.
string str2="ksksks";
string res = str2 + to_string(5);
cout<<res<<endl;
//string 拼接 字符
string str3=str2+'c';
cout<<str3<<endl;