博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c字符串函数
阅读量:1870 次
发布时间:2019-04-26

本文共 5127 字,大约阅读时间需要 17 分钟。

C Primer Plus总结

字符串函数

C库提供了多个处理字符串的函数,ANSI C把这些函数的原型放在
string.h头文件中。其中最常用的函数有 strlen()、strcat()、strcmp()、
strncmp()、strcpy()和 strncpy()。另外,还有sprintf()函数,其原型在stdio.h头
文件中。欲了解string.h系列函数的完整列表,请查阅C99和C11的标准ANSI C库”。
strlen()
计算字符串的长度
stract()
strcat()(用于拼接字符串)函数接受两个字符串作为参数。该函数把第
2个字符串的备份附加在第1个字符串末尾,并把拼接后形成的新字符串作为
第1个字符串,第2个字符串不变。strcat()函数的类型是char *(即,指向char
的指针)。strcat()函数返回第1个参数,即拼接第2个字符串后的第1个字符
串的地址。

#include
#include
int main() { char str1[] = "first "; char str2[] = "two"; strcat(str1, str2); printf("%s\n", str1); return 0;}

strncat()

strcat()函数无法检查第1个数组是否能容纳第2个字符串。如果分配给第
1个数组的空间不够大,多出来的字符溢出到相邻存储单元时就会出问题。注意,要给拼接后的字符串长度加1才够空间存放末尾的空字符。或者,用strncat(),该函数的第3个参数指定了最大添加字符数。例如,strncat(bugs,addon, 13)将把 addon字符串的内容附加给bugs,在加到第13个字符或遇到空字符时停止。因此,算上空字符(无论哪种情况都要添加空字符),bugs数组应该足够大,以容纳原始字符串(不包含空字符)、添加原始字符串在后面的13个字符和末尾的空字符。

#include
#include
int main() { char str1[7] = "first "; char str2[4] = "two"; strncat(str1, str2, 2); printf("%s\n", str1); return 0;}

strcmp()

ASCII标准规定,在字母表中,如果第1个字符串在第2个字符串前面,
strcmp()返回一个负数;如果两个字符串相同,strcmp()返回0;如果第1个字
符串在第2个字符串后面,strcmp()返回正数。然而,返回的具体值取决于实
现。

#include
#include
int main() { char str1[2] = "A"; char str2[2] = "B"; char str3[2] = "B"; printf("%d\n", strcmp(str1, str2)); printf("%d\n", strcmp(str2, str1)); printf("%d\n", strcmp(str2, str3));printf("%d\n", strcmp("apples", "apple"));printf("%d\n", strcmp("apple", "apples")); return 0;}

strcmp(“apple”, “apples”)表明,strcmp()比较所有的字符,不只是字母。所以,与

其说该函数按字母顺序进行比较,不如说是按机器排序序列(machine
collating sequence)进行比较,即根据字符的数值进行比较(通常都使用
ASCII值)。在ASCII中,大写字母在小写字母前面,所以strcmp(“Z”, “a”)返
回的是负值。
大多数情况下,strcmp()返回的具体值并不重要,我们只在意该值是0还
是非0(即,比较的两个字符串是否相等)。或者按字母排序字符串,在这
种情况下,需要知道比较的结果是为正、为负还是为0。
strncmp()
strcmp()函数比较字符串中的字符,直到发现不同的字符为止,这一过
程可能会持续到字符串的末尾。而strncmp()函数在比较两个字符串时,可以
比较到字符不同的地方,也可以只比较第3个参数指定的字符数。

#include
#include
int main() {char * str[10] {
"abcad", "bfadv", "asfdaf", "bbab", "ab"};int i = 0;while (i < 5) {if (strncmp(str[i], "ab", 2) == 0) printf("%s\n", str[i]); i++;}return 0;}

strcpy()和strncpy()

strcpy(str1, str2)该函数把后一个字符串拷贝到第一个字符串
strcpy()函数还有两个有用的属性。第一,strcpy()的返回类型是 char *,
该函数返回的是第 1个参数的值,即一个字符的地址。第二,第 1 个参数不
必指向数组的开始。这个属性可用于拷贝数组的一部分。
strcpy()和 strcat()都有同样的问题,它们都不能检查目标空间是否能容
纳源字符串的副本。拷贝字符串用 strncpy()更安全,该函数的第 3 个参数指
明可拷贝的最大字符数。
sprintf()
sprintf()函数声明在stdio.h中,而不是在string.h中。该函数和printf()类
似,但是它是把数据写入字符串,而不是打印在显示器上。因此,该函数可
以把多个元素组合成一个字符串。sprintf()的第1个参数是目标字符串的地
址。其余参数和printf()相同,即格式字符串和待写入项的列表。

#include
int main() {char * str[10] {
"I", "have", "100", "$"};char s[15];sprintf(s, "%s %5s %5s%s", str[0], str[1], str[2], str[3]);puts(s);return 0;}

ANSI C库有20多个用于处理字符串的函数,下面总结了一些常用的函

数。
char strcpy(char restrict s1, const char * restrict s2);
该函数把s2指向的字符串(包括空字符)拷贝至s1指向的位置,返回值是s1。
char strncpy(char restrict s1, const char * restrict s2, size_t n);
该函数把s2指向的字符串拷贝至s1指向的位置,拷贝的字符数不超过
n,其返回值是s1。该函数不会拷贝空字符后面的字符,如果源字符串的字
符少于n个,目标字符串就以拷贝的空字符结尾;如果源字符串有n个或超过n个字符,就不拷贝空字符。
char strcat(char restrict s1, const char * restrict s2);
该函数把s2指向的字符串拷贝至s1指向的字符串末尾。s2字符串的第1
个字符将覆盖s1字符串末尾的空字符。该函数返回s1。
char strncat(char restrict s1, const char * restrict s2, size_t n);
该函数把s2字符串中的n个字符拷贝至s1字符串末尾。s2字符串的第1个
字符将覆盖s1字符串末尾的空字符。不会拷贝s2字符串中空字符和其后的字符,并在拷贝字符的末尾添加一个空字符。该函数返回s1。
int strcmp(const char * s1, const char * s2);
如果s1字符串在机器排序序列中位于s2字符串的后面,该函数返回一个
正数;如果两个字符串相等,则返回0;如果s1字符串在机器排序序列中位于s2字符串的前面,则返回一个负数。
int strncmp(const char * s1, const char * s2, size_t n);
该函数的作用和strcmp()类似,不同的是,该函数在比较n个字符后或遇
到第1个空字符时停止比较。
char strchr(const char s, int c);
如果s字符串中包含c字符,该函数返回指向s字符串首位置的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果在字符串s中未找到c字符,该函数则返回空指针。

#include
#include
int main() {char * str[10] {
"I", "have", "100", "$"};if (strchr(str[1], 'h') != NULL) puts(strchr(str[1], 'h'));return 0;}

char strpbrk(const char s1, const char * s2);如果 s1 字符中包含 s2 字符

串中的任意字符,该函数返回指向 s1 字符串首位置的指针;如果在s1字符
串中未找到任何s2字符串中的字符,则返回空字符。
char strrchr(const char s, int c);该函数返回s字符串中c字符的最后一次
出现的位置(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到c字符,则返回空指针。
char strstr(const char s1, const char * s2);
该函数返回指向s1字符串中s2字符串出现的首位置。如果在s1中没有找到s2,则返回空指针。
size_t strlen(const char * s);
该函数返回s字符串中的字符数,不包括末尾的空字符。
请注意,那些使用const关键字的函数原型表明,函数不会更改字符串。例如,下面的函数原型:
char strcpy(char restrict s1, const char * restrict s2);
表明不能更改s2指向的字符串,至少不能在strcpy()函数中更改。但是可
以更改s1指向的字符串。这样做很合理,因为s1是目标字符串,要改变,而
s2是源字符串,不能更改。
字符串转换为数字
atoi()函数(用于把字母数字转换成整数),该函数接受一个字符串作
为参数,返回相应的整数值。
atoi(“42regular”)将返回整数42。
atoi(“regular”)将返回整数0
从ANSI C开始,stdlib.h头文件中包含了atoi()函数的原型。除此之外,还包含了 atof()和 atol()函数的原型。atof()函数把字符串转换成 double 类型的值, atol()函数把字符串转换成long类型的值。atof()和atol()的工作原理和atoi()类似,因此它们分别返回double类型和long类型。
ANSI C还提供一套更智能的函数:strtol()把字符串转换成long类型的
值,strtoul()把字符串转换成unsigned long类型的值,strtod()把字符串转换成
double类型的值。这些函数的智能之处在于识别和报告字符串中的首字符是
否是数字。而且,strtol()和strtoul()还可以指定数字的进制。
下面的程序示例中涉及strtol()函数,其原型如下:
long strtol(const char * restrict nptr, char ** restrict endptr, int base);
这里,nptr是指向待转换字符串的指针,endptr是一个指针的地址,该
指针被设置为标识输入数字结束字符的地址,base表示以什么进制写入数字

#include
#include
int main() {char str[] = {
"123"};char * end;printf("%ld\n", strtol(str, &end, 10));return 0;}

转载地址:http://gweff.baihongyu.com/

你可能感兴趣的文章
CSS3&JavaScript 图片分隔切换
查看>>
CSS3&JavaScript 瀑布流
查看>>
tomcat配置JVM
查看>>
Oracle获取连接超级慢的问题
查看>>
关于HashMap初始化容量,设置多少合适。
查看>>
MYSQL 自定义函数
查看>>
早鸟票倒计时3天 | 2019携程技术峰会,11月9日上海(含福利)
查看>>
干货 | 微信小程序一键转百度小程序,携程火车票团队是这样做的
查看>>
沙龙回顾 | 移动互联网下的测试工程效率提升,含PPT和视频
查看>>
程里人 | 携程程序猿/媛的1024
查看>>
常见的字符集编码
查看>>
前端(一):字符与语义标签
查看>>
前端(二):CSS语法与选择器
查看>>
前端(三):样式继承与其他概念
查看>>
前端(四):样式继承与其他概念
查看>>
前端小案例:田径场
查看>>
前端(五):浮动
查看>>
前端(六):高度塌陷与BFC
查看>>
C++ 多线程
查看>>
C++ inline 内联函数
查看>>