C,C++字符串总结

1. C、C++ 字符串处理

介绍C和C++语言中的字符串处理及相应的转换等操作。

1.1. C++ 字符串

C++标准库中定义了一个string类,用来处理可变长字符序列。使用string类要包含头文件,string定义在命名空间std中;

1.1.1. string的定义和初始化

string str1;              //定义等于string str1 = "" 
string str2 = str1;       //复制赋值
string str3 = "abcde";    //直接赋值
string str4(char* str);   //字符串指针初始
string str5(5,'c');       //str5的内容为ccccc

使用char* 初始化时,定义为char str[]的数组也是可以的。

1.1.2. string常用操作函数及说明

函数/操作符 说明
基本函数
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处理函数
  

1.1.3. string,ctring,string.h的关系

  1. 要了解这几个头文件的关系,首先需要了解C++和C头文件的关系:C++标准库除了定义C++语言特有的功能外,也兼容了C语言的标准库,C语言的头文件如name.h,C++则将这些文件定义为cname。就是去掉了.h,在文件名之前加了c。

  2. 因此cctype和ctype.h头文件的内容是一样的,只不过从命名规范来说更符合C++的规范要求,特别的,在cname的头文件中定义的名字从属于命名空间std,而.h则不是。总的来说,C++中最好用c开头的文件而不是.h,这样更符合规范,用.h也无所谓,内容是一样的。

  3. 从上面来说,cstring和string.h包含的内容都是一样的,都是C语言中定义的一些字符串处理函数等,而string则是C++中定义的一个处理字符串的类,与前面两个是完全不同的。

1.2. C字符串

C语言中没有字符串类的封装,使用的是char* 指针或char []数组来表示字符串。两者有相同也有不同之处,char* 定义的是一个指针,是需要分配空间的,或者直接使用常量字符串赋值,char []定义的是一个数组,数组名实际就是一个char* 指针。

1.2.1. 初始化及赋值

const char* str1 = "abcdefg";
char str2[] = "abcde";
char* str3 = str2 + 1;
char* str4 = (char*)malloc(10); str4 = str3;
  • 第一个使用字符串常量进行赋值给一个指针,”abcdefg”是一个常量,保存在静态存储区,因此要使用const修饰,不然会有warning,这个str1可以指向其它的字符串,指向其它字符串时可以改变指向位置的字符值,但是指向”abcdefg”时不能改变其值,因为其在常量区;
  • 数组str2实际是一个指针,是可以赋值给char* 的,还可以进行加移位,上面的str3就指向:”bcde”;
  • 不可用char* 来初始化char [], 因为char []为数组,是需要分配空间大小的,char* 只是一个指针;
  • sizeof(str1) = 8; sizeof(str2) = 6; strlen(str1) = 7; strlen(str2) = 5; sizeof计算的是内存空间大小,str1为指针,64位下位8字节,str2有5个字符,加上一个字符串结束符’\0’共6个,strlen计算的是实际字符串中字符的个数,不包含字符串结束符’\0’;

1.2.2. 常用操作和函数

函数 说明
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.

1.3. 字符串转换

在实际的应用中,经常需要进行字符串与数字的转换等操作,下面分别介绍C和C++字符串进行转换的方法。

1.3.1. C++字符串与C字符串转换

在C++中,也是可以使用C中的字符串的,两者之间可以实现互相转换。
  
1. C字符串转C++字符串:

char* pc;
string str = string(pc);
  1. C++字符串转C字符串:
string str("OK");
char* p = str.c_str();

1.3.2. C++字符串与数字之间的转换

C++中字符串与数字之间的转换一般是通过类stringstream来实现的,继承自iostream,主要用来处理字符串流,还有istringstream和ostringsteam。
1. 字符串到数字

string str = "126";
stringstream sstr(str);
int x;
sstr >> x; //x为整数126,x定义为什么类型,则输出什么类型
  1. 数字到字符串
stringstream sstr;
int x = 126;
sstr << x;
string str = sstr.str();  //str为"126"字符串

stringsteam可以实现两种功能,其中istringstream可以实现字符串到数字转换(输入字符串),ostringstream可以实现数字到字符串的转换(输出字符串)。注意字符串与数字之间的转换只涉及数字0-9,+,-,.等可以在数字中出现的符号,不能转换如abc等字符,遇到则终止。

stringstream使用总结

1.3.3. C字符串与数字之间的转换

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)等。*/
  1. 数字到字符串
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);

1.3.4. 格式化字符串

一般使用的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) //连接字符串

使用这两个函数要注意缓冲区溢出。

1.3.5. 格式化说明符

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格式化规定符

C++ Reference

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ahafg/article/details/58657725
文章标签: 字符串 转换 string
个人分类: C/C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭