介绍C和C++语言中的字符串处理及相应的转换等操作。
C++标准库中定义了一个string类,用来处理可变长字符序列。使用string类要包含头文件,string定义在命名空间std中;
string str1; //定义等于string str1 = ""
string str2 = str1; //复制赋值
string str3 = "abcde"; //直接赋值
string str4(char* str); //字符串指针初始
string str5(5,'c'); //str5的内容为ccccc
使用char* 初始化时,定义为char str[]的数组也是可以的。
函数/操作符 | 说明 |
---|---|
基本函数 | |
str.empty() | 字符串是否为空 |
str.c_str() | string类型转char* |
str.size(), str.length() | 字符串大小,length和size一样 |
str[n] | 获取字符串第n个字符,类似于数组 |
操作符 | |
+, += | 字符串相加:str1 + str2 ; str1 += str2 |
==, !=, < >, <=, => | 字符串比较符,实际按照顺序比较每一个字符的ascii码值的大小 |
常用函数 | |
string &append(const string &s); | 同operator+=() |
string &append(int n,char c); | 在当前字符串结尾添加n个字符c |
string &append(const string &s,int pos,int n); | 把字符串s中从pos开始的n个字符连接到当前字符串的结尾 |
string &append(const char *s); | 把c类型字符串s连接到当前字符串结尾 |
string &append(const char *s,int n); | 把c类型字符串s的前n个字符连接到当前字符串结尾 |
string substr(int pos = 0,int n = npos) const; | 返回pos开始的n个字符组成的字符串,没有指明第二个参数时默认到字符串结尾 |
int find(char c, int pos = 0) const; | 从pos开始查找字符c在当前字符串的位置 |
int find(const string &s, int pos = 0) const; | 从pos开始查找字符串s在当前串中的位置 |
int find(const char *s, int pos = 0) const; | 从pos开始查找字符串s在当前串中的位置 |
int find(const char *s, int pos, int n) const; | 从pos开始查找字符串s中前n个字符在当前串中的位置 |
int rfind(char c, int pos = npos) const; | 从pos开始从后向前查找字符c在当前串中的位置 |
int rfind(const string &s,int pos = npos) const; | 查找成功时返回所在位置,失败返回string::npos的值 |
void swap(string &s2); | 交换当前字符串与s2的值 |
string &replace(int p0, int n0,const string &s); | 删除从p0开始的n0个字符,然后在p0处插入串s |
string &replace(int p0, int n0,const string &s, int pos, int n); | 删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符 |
string &replace(int p0, int n0,int n, char c); | 删除p0开始的n0个字符,然后在p0处插入n个字符c |
string &insert(int p0,const string &s); | p0位置插入s |
string &insert(int p0,const string &s, int pos, int n); | 在p0位置插入字符串s中pos开始的前n个字符 |
string &insert(int p0, int n, char c); | 此函数在p0处插入n个字符c |
string &erase(int pos = 0, int n = npos); | 删除pos开始的n个字符,返回修改后的字符串 |
string的遍历和数组类似str[i],这里得到的是一个char类型字符,当用地址&str[i]获取时获取的是第i个字符及之后的字符,不是一个字符。
string类中还定义很多函数,用于string的不同类型的处理和应用,可参考:
C++string处理函数
要了解这几个头文件的关系,首先需要了解C++和C头文件的关系:C++标准库除了定义C++语言特有的功能外,也兼容了C语言的标准库,C语言的头文件如name.h,C++则将这些文件定义为cname。就是去掉了.h,在文件名之前加了c。
因此cctype和ctype.h头文件的内容是一样的,只不过从命名规范来说更符合C++的规范要求,特别的,在cname的头文件中定义的名字从属于命名空间std,而.h则不是。总的来说,C++中最好用c开头的文件而不是.h,这样更符合规范,用.h也无所谓,内容是一样的。
从上面来说,cstring和string.h包含的内容都是一样的,都是C语言中定义的一些字符串处理函数等,而string则是C++中定义的一个处理字符串的类,与前面两个是完全不同的。
C语言中没有字符串类的封装,使用的是char* 指针或char []数组来表示字符串。两者有相同也有不同之处,char* 定义的是一个指针,是需要分配空间的,或者直接使用常量字符串赋值,char []定义的是一个数组,数组名实际就是一个char* 指针。
const char* str1 = "abcdefg";
char str2[] = "abcde";
char* str3 = str2 + 1;
char* str4 = (char*)malloc(10); str4 = str3;
函数 | 说明 |
---|---|
str[] | 按位置获取字符,char* 不支持==, !=, <, >等字符 |
size_t strlen( const char * str ) | 返回字符串长度 |
char* strcat(char* dest, const char* src) | 字符串src附加到dest后,返回的是dest |
char* strcpy(char* dest, const char* src) | 字符串src拷贝到dest |
int strcmp( const char* str1, const char* str2 ) | 比较字符串str1,str2,相等为0 |
void* memset(void* dest, int c, size_t count); | 将dest前面count个字符置为字符c. 返回dest的值 |
void* memmove(void* dest, const void* src, size_t count); | 从src复制count字节的字符到dest. 如果src和dest出现重叠, 函数会自动处理.返回dest的值 |
void* memcpy(void* dest, const void* src, size_t count); | 从src复制count字节的字符到dest. 与memmove相同, 只是不能处理src和dest出现重叠, |
int memcmp(const void* buf1, const void* buf2, size_t count); | 比较buf1和buf2前面count个字节大小.0,表示buf1等于buf2 |
函数-说明: |
---|
char* strchr(const char* str, int c): |
查找字符串str中首次出现的位置, NULL结束符也包含在查找中. 返回一个指针, 指向字符c在字符串str中首次出现的位置, 如果没有找到, 则返回NULL |
char* strrchr(const char* str, int c): |
查找字符c在字符串string中最后一次出现的位置, 也就是对str进行反序搜索, 包含NULL结束符返回一个指针, 指向字符c在字符串str中最后一次出现的位置, 如果没有找到, 则返回NULL |
char* strstr(const char* str, const char* strSearch): |
在字符串str中查找strSearch子串. 返回子串strSearch在str中首次出现位置的指针. 如果没有找到子串strSearch, 则返回NULL. 如果子串strSearch为空串, 函数返回str值. |
char* strncat(char* dest, const char* src, size_t count): |
将源串src开始的count个字符添加到目标串dest后. 源串src的字符会覆盖目标串dest后面的结束符NULL. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况. 函数返回dest值 |
char* strncpy(char* dest, const char* src, size_t count): |
将源串src开始的count个字符复制到目标串dest所指定的位置. 如果count值小于或等于src串的长度, 不会自动添加NULL结束符目标串中, 而count大于src串的长度时, 则将src用NULL结束符填充补齐count个字符, 复制到目标串中. 不能处理源串与目标串重叠的情况.函数返回dest值. |
更多详细函数说明:C语言字符串操作总结大全
memcpy,memset,memmove以及strncpy复制长度较小时,目标字符串都不会自动添加字符串结束符’\0’,因此有时候使用时要小心谨慎,获取在使用字符串前利用memset把所用的空间值都设置为0.
在实际的应用中,经常需要进行字符串与数字的转换等操作,下面分别介绍C和C++字符串进行转换的方法。
在C++中,也是可以使用C中的字符串的,两者之间可以实现互相转换。
1. C字符串转C++字符串:
char* pc;
string str = string(pc);
string str("OK");
char* p = str.c_str();
C++中字符串与数字之间的转换一般是通过类stringstream来实现的,继承自iostream,主要用来处理字符串流,还有istringstream和ostringsteam。
1. 字符串到数字
string str = "126";
stringstream sstr(str);
int x;
sstr >> x; //x为整数126,x定义为什么类型,则输出什么类型
stringstream sstr;
int x = 126;
sstr << x;
string str = sstr.str(); //str为"126"字符串
stringsteam可以实现两种功能,其中istringstream可以实现字符串到数字转换(输入字符串),ostringstream可以实现数字到字符串的转换(输出字符串)。注意字符串与数字之间的转换只涉及数字0-9,+,-,.等可以在数字中出现的符号,不能转换如abc等字符,遇到则终止。
C中有许多方法可以将字符串和数字进行转换,如sscanf,sprintf,atoi,itoa等函数。
1. 字符串到数字
int atoi(const char *nptr);
/*atoi()函数会扫描参数nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。如果nptr不能转换成int 或者nptr为空字符串,那么将返回 0。例:*/
int n;
char *str = "124";
n = atoi(str); //n=124
/*与atoi函数类似的还有atof,atol,strtod,strtol,strtoul等,分别为字符串转换为浮点数(float),长整型(long)等。*/
char*itoa(int value,char*string,int radix);
//itoa与atoi功能相反,int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等
int number=156;
char string[10];
itoa(number,string,10);
一般使用的scanf和printf函数都是针对标准输入输出进行格式化字符串的,在C中还有针对字符串缓冲区进行字符串格式化的:sscanf,sprintf。格式化字符串也可以用来进行格式转换。
函数 | 说明 |
---|---|
int sscanf(const char *str, const char *format, …) | 将字符串str根据字符串参数format来转换并格式化数据,转换后的结果存于对应的参数内。返回正确扫描的参数个数。 |
int sprintf(char *str, const char *format, …) | 作用是格式化字符串str并输出。函数调用最终打印到字符缓冲区中的字符数目 |
sscanf(str, "%d", &i ); // 将字符串转换成整数 i
sprintf(str,"%d",data);//将data转换为字符串
sprintf(str,"%s and %s",str1, str2) //连接字符串
使用这两个函数要注意缓冲区溢出。
c中函数printf,scanf,sprintf等函数都是需要格式化符来决定输出格式的(format参数),下面为常见的格式化符。
符号 | 说明 |
---|---|
%d | 十进制有符号整数 |
%u | 十进制无符号整数 |
%f | 浮点数包括float和double |
%s | 字符串 |
%c | 单个字符 |
%x | %X 无符号以十六进制表示的整数 |
%0 | 无符号以八进制表示的整数 |
- 控制输出宽度:在”%”和字母之间插进数字表示最大场宽
- 浮点数显示位数:%a.bf, a为总显示长度,b为小数位长度
- 对齐:在”%”和字母之间加入一个”-” 号可说明输出为左对齐, 默认为右对齐。
- 填充:在”%”后和数字前加0,表示用0填充(%08d,显示8位不足填0)
详细参考:C格式化规定符
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。