注意:
- 以下所有有关位置的参数,无论是C风格字符数组还是C++风格的字符串,首字符索引都为0。
- 下文无论是C风格字符数组还是C++风格的字符串,均统称为字符串。在需要区别时会特别指出。
- 使用C相关函数需调用string.h库。
- 在操作C风格字符数组时,请尽量使用C相关函数,而不是“+” “=”或关系运算符,这可能会导致无法预料的错误。
字符串字面量
定义
在程序中以明文展示的字符串,例如"123"、"AB\nCD"这种,被称为字符串字面量,也称字符串常量。
在C中,字符串字面量被视为字符数组:
printf("%d", sizeof("ABC"));
因此,可对字符串字面量使用下标:
printf("%c", "ABC"[0]);
存储与赋值
字符串字面量可以初始化数组的方式赋值给字符数组:
char s[4] = "123";
此时字面量按字符数组的方式逐赋值给s。s的各项可以自由更改。
若将字符串字面量赋值给char*,编译器会开辟一块只读的内存空间给字符串字面量,然后将该内存的地址赋值给char*。 由于字面量被视为常量,对指针指向的内存地址进行修改是非法的,但由于指针本身为变量,反复令指针指向不同字面量的地址则是合法的。
char *s = "123";
*(s+1) = '4';
strcpy(s, "456");
s = "456";
获取长度
C
size_t strlen(const char *str)
注意:size_t一般被编译器定义为无符号int型,因此在计算字符串长度或别的需要对size_t类型的变量运算时,要注意避免给变量赋值为负数,这会导致不可预料的错误。
另外,strlen函数不会计算字符串末尾的空字符,但对字符数组名进行sizeof,会返回数组实际大小(也就是会算上末尾的空字符)。
C++
string s;
s.size()
比较
单个字符(char类型)可直接使用>、<、==比较。
字符串(string、char []、char*类型)则需要调用相关函数。比较规则:自左向右逐个字符,按其对应的ASCII码的大小进行比较。若字符串长度不一致,则短字符串末尾之后被视为空字符进行比较(空字符的ASCII码为0)。
C
无论是char []或char*都必须使用函数strcmp或strncmp,直接用>、<、==可能导致结果不准。
int strcmp(const char *str1, const char *str2)
int strncmp(const char *str1, const char *str2, size_t n)
若相等,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
C++
直接>、<、==即可,或者:
string str1, str2;
str1.compare(str2);
str1.compare(pos1,len1,str2,pos2,len2);
查找
C
char *strchr(const char *str, int c)
char *strrchr(const char *str, int c)
char *strstr(const char *s1, const char *s2)
C++
str1.find(str2);
str1.rfind(str2);
清除或填充
C
memset(void *p, int c, size_t n)
从p指向的地址开始,对接下来的连续n个字节的内存空间,逐字节置为c。对于字符串,n为字符串长度乘以sizeof(char);对于数组,n为元素数量乘以每个元素的字节数。
对于int型数组,数组的单个元素占4个字节,若c=1,逐个字节填充后数组中单个元素会被置为:
00000001 00000001 00000001 00000001
转成十进制是16843009。
因此,若要用memset初始化整型数组,仅0和-1可起到预期效果。
C++
string s;
s.clear();
s.erase(pos,len);
修改
C
char *strcat(char * s1, const char *s2)
char *strncat(char *s1, const char *s2, size_t n)
char *strcpy(char *s1, const char *s2)
char *strncpy(char *s1, const char *s2, size_t n)
此外,也可以使用memcpy,直接从内存中复制对应值实现对字符串的修改。
C++
str1.append(str2);
str1.append(str2,pos,len);
str1.insert(pos1,str2);
str1.insert(pos1,str2,pos2,len2);
str1.insert(pos1,num,char);
str2 = str1.substr(pos);
str2 = str1.substr(pos,len);
str1.replace(pos,len,str2);
str1.replace(pos1,len1,str2,pos2,len2);
格式转换
C与C++转换
C字符串可直接赋值给C++字符串。
C++字符串s转C字符串c:
strcpy(c, s.c_str());
字符串转数字
C
使用sscanf函数,方法与参数与scanf类似,区别在于scanf从设备(键盘)中取得内容放入变量,而sscanf从str中获得内容放入变量。
int sscanf(const char *str, const char *format, ...)
int d;
char s[5] = "123";
sscanf(s, "%d", &d);
该方法支持整数、小数及多种进制类型,通过格式控制符format来操作。
C++:
#include <sstream>
...
string str = "123.45";
double d;
stringstream ss;
ss << str;
ss >> d;
数字转字符串
C
使用sprintf函数,方法与参数与printf类似,区别在于printf将变量内容输出到屏幕,而sprintf将变量内容输出到str。
int sprintf(char *str, const char *format, ...)
int d = 123;
char s[5];
sprintf(s, "%d", d);
该方法支持整数、小数及多种进制类型,通过格式控制符format来操作。
C++:(同样支持整数和实数)
#include <sstream>
...
double a=12.34;
string str;
stringstream ss;
ss << a;
ss >> str;
参考资料
菜鸟教程
|