字符串处理函数操作字符数组
常用字符串操作函数如下所示:
Strcmp函数用法
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> #include <string> using namespace std; int main() { char src[]="hello", dest[]="world"; int strcompare = strcmp(dest, src); //将“hello”与“world”相比较,当dest > src, return 1; 当dest < src, return -1; 当dest = src, return 0 cout << strcompare << endl; } |
字符串比较规则:
在ASCII码值中,数字的编码是48-57,大写字母的编码是65-90,小写字母的编码是97-122。其实,就是
在ASCII码值中,数字的编码是48-57,大写字母的编码是65-90,小写字母的编码是97-122。其实,就是按照字母,数字等等字符在ASCII码值中的排列顺序的先后。
下图为ASCII简单的一部分编码表:
Strcat函数的用法
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> #include <string> using namespace std; int main() { char src[50]="hello", dest[]="world"; strcat(sre, dest); //把“world"连接到“hello”后面,该函数调用格式“strcat(被扩充字符串, 被添加字符串)” cout << dest << endl; } |
注意:被扩充字符串src数组的空间必需够用,否则会导致内存溢出。
如何判断src数组的空间是否够用?
我们回忆一下:字符串与字符型数组的区别——字符串转为字符型数组后应在结尾添加’\0’作为字符串结尾的标志,而且’\0’占一个bit的空间(因为数组类型时char类型)。因此,src扩充后应该占用5+5+1(当添加字符串时,被扩充字符型数组src中的’\0’被取消,这是为了迎接新字符段的加入)。
附:字符串在字符型数组中的存储方式:
该函数调用格式:
Strcat(char*destination, const char* source)这个表述太复杂,改进一下:Strcat(被扩充字符数组的数组名,添加字符数组的数组名)。函数返回值为“被扩充字符型数组的数组名(地址)”,为啥返回地址呀?对地址进行操更加方便快捷。
Strcpy函数的用法
该函数的定义原型为:char * strcpy( char destination[], const char source[]);
相关的说明在这里:http://www.cplusplus.com/reference/cstring/strcpy/
其作用就是将第2个参数的字符串拷贝到第一个参数的字符数组中,所以要保证第1个参数的字符数组大小够用。注意:第2个参数的结束符 '\0' 也会拷贝过去哦。
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> #include <string> using namespace std; int main() { char src[50]="hellohellohello", dest[]="world"; strcpy(src, dest); //把“world"替换“hello” cout << dest << endl; } |
这里有个疑问:是不是把缓冲区内的src数组中的字符全部刷新取消,再填入”world”?
No,不是的,看如下调试:
程序只是把src字符数组内的前五位替换为world,再在最后一位填入’\0’表示字符串已结束,此时在从缓存区内src位置读取字符,只能读取到首个字符到’\0’的所有字符,即’world’。
Strlen函数的用法
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> #include <string> using namespace std; int main() { char des[50] = "hello"; int len = strlen(des); cout << "len = " << len << endl; // 结果为5,计算数组真实长度时不包括'\0' } |
该函数的定义原型为:int size =strlen (const char str[])
Strchr函数的用法
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> #include <string> using namespace std; int main() { char des[] = "hello"; char*place = strchr(des,'e'); // 计算'e'单个字符的地址,这个地址时绝对地址就是'e'在缓冲区内的地址,我们要转化为相对地址 cout << "place = " << place-des+1 << endl; // 相对地址为2 } |
Strstr函数的用法
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> #include <string.h> int main() { char str[] = "This is a simple string"; char * pch; pch = strstr(str, "simple"); // 求“simple”的第一个字符's'在字符数组中出现的绝对地址 std::cout << pch - str + 1 << std::endl; // 将“simple”的第一个字符's'在字符数组中出现的绝对地址转化为相对地址(结果为11) return 0; } |