各位老铁们,大家好,今天由我来为大家分享C语言处理字符串的7个函数,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
事情应该尽可能简单
让我们看一下该字符串的更多内容。
但并不简单。
fit() 函数将第39 个元素中的逗号替换为“\0”字符。 put() 函数在空字符处停止输出并忽略其余字符。但是,字符仍然在缓冲区中,并且以下函数调用将它们打印出来:
投入(消息+ 39);表达式mesg + 39是mesg[39]的地址,空格字符存储在该地址处。因此,puts() 显示该字符并继续输出,直到在原始字符串中遇到空字符。下图演示了这个过程。
put() 函数和空字符。
注意
一些ANSI 之前的系统使用strings.h 头文件,而某些系统可能根本没有strings 头文件。
string.h头文件包含了C字符串函数系列的原型,因此程序test_fit.c必须包含该头文件。
2 strcat()函数
strcat()(用于连接字符串)函数接受两个字符串作为参数。该函数将第二个字符串的备份追加到第一个字符串的末尾,并使用拼接后形成的新字符串作为第一个字符串,而第二个字符串保持不变。 strcat()函数的类型是char *(即指向char的指针)。 strcat() 函数返回第一个参数,即连接第二个字符串后第一个字符串的地址。
你最喜欢什么花?
奇迹花
Wonderflowers闻起来像旧鞋子。
闻起来像旧鞋子。
再见
从上面的输出可以看出,flower 发生了变化,而addon 保持不变。
3 strncat()函数
strcat() 函数无法检查第一个数组是否可以容纳第二个字符串。如果分配给第一个数组的空间不够大,当多余的字符溢出到相邻的存储单元时就会出现问题。当然,您可以使用strlen() 检查第一个数组的长度。注意,需要将拼接字符串的长度加1,以便有足够的空间来存储末尾的空字符。或者,使用strncat(),其第三个参数指定要添加的最大字符数。例如,strncat(bugs, addon, 13) 会将插件字符串的内容追加到bugs 中,并在到达第13 个字符或遇到空字符时停止。因此,计算空字符(在任一情况下都会添加),bugs 数组应该足够大以容纳原始字符串(没有空字符),加上原始字符串后面的13 个字符和末尾的空字符。程序join_chk.c 使用此方法来计算可用变量的值,以表示允许添加的最大字符数。
/* join_chk.c — 连接两个字符串,首先检查大小*/#include stdio.h#include string.h#define SIZE 30#define BUGSIZE 13char * s_gets(char * st, int n);int main(void) { 炭花[大小]; char addon[]=闻起来像旧鞋子。’;字符错误[BUGSIZE];可用整数; puts(‘你最喜欢什么花?’); s_gets(花, 尺寸); if ((strlen(插件) + strlen(花) + 1)=SIZE) strcat(花, 插件);投入(花); puts(‘你最喜欢的bug 是什么?’); s_gets(bug, BUGSIZE);可用=BUGSIZE – strlen(bug) – 1; strncat(错误,插件,可用);投入(错误);返回0;}char * s_gets(char * st, int n){ char * ret_val;整数i=0; ret_val=fgets(st, n, 标准输入); if (ret_val) { while (st[i] !=’n’ st[i] !=’0′) i++; if (st[i]==’n’) st[i]=’0′; else //必须有words[i]==’0′ while (getchar() !=’n’) continue; } return ret_val;} 下面是程序运行的例子:
你最喜欢什么花?玫瑰玫瑰闻起来像旧鞋子。你最喜欢的错误是什么?蚜虫气味读者可能已经注意到,strcat() 与gets() 类似,也会导致缓冲区溢出。为什么C11 标准不弃用strcat(),只保留strncat()? gets()为什么这么残忍?这可能是因为gets() 造成的安全风险来自于使用程序的人,而strcat() 暴露的问题则是由粗心的程序员造成的。您无法控制用户执行的操作,但您可以控制程序执行的操作。 C 语言信任程序员,因此确保strcat() 安全使用是程序员的责任。
4 strcmp()函数
假设您要将用户的响应与存储的字符串进行比较,如程序nogo.c 中所示。
/* nogo.c——这行得通吗? */#include stdio.h#define ANSWER ‘Grant’#define SIZE 40char * s_gets(char * st, int n);int main(void){ char try[SIZE] ; puts(‘谁埋在格兰特的坟墓里?’); s_gets(尝试,大小); while (try !=ANSWER) { put(‘不,那是错误的。再试一次。’); s_gets(尝试,大小); } put(‘没错!’);返回0;}char * s_gets(char * st, int n){ char * ret_val;整数i=0; ret_val=fgets(st, n, 标准输入); if (ret_val) { while (st[i] !=’n’ st[i] !=’0′) i++; if (st[i]==’n’) st[i]=’0′; else //必须有words[i]==’0′ while (getchar() !=’n’) continue; } return ret_val;} 这个程序看上去没问题,但是运行起来却出了问题。 ANSWER 和try 都是指针,所以try !=ANSWER 不是检查两个字符串是否相等,而是检查两个字符串的地址是否相同。因为ANSWE和try存储在不同的位置,所以两个地址不能相同。因此,无论用户输入什么,程序都会提示输入不正确。这太令人沮丧了。
这个函数要比较的是字符串的内容,而不是字符串的地址。读者可以自己设计一个函数,也可以使用C标准库中的strcmp()函数(用于字符串比较)。该函数使用比较运算符来比较字符串,就像比较数字一样。如果两个字符串参数相同,则函数返回0,否则返回非零值。修改后的版本显示在程序compare.c中。
/* Compare.c — 这将起作用*/#include stdio.h#include string.h //声明strcmp()#define ANSWER ‘Grant’#define SIZE 40char * s_gets(char * st, int n);int main(void){ char 尝试[SIZE]; puts(‘谁埋在格兰特的坟墓里?’); s_gets(尝试,大小); while (strcmp(try,ANSWER) !=0) { puts(‘不,这是错误的。再试一次。’); s_gets(尝试,大小); } put(‘没错!’);返回0;}char * s_gets(char * st, int n){ char * ret_val;整数i=0; ret_val=fgets(st, n, 标准输入); if (ret_val) { while (st[i] !=’n’ st[i] !=’0′) i++; if (st[i]==’n’ ) st[i]=’0′; else //必须有words[i]==’0′ while (getchar() !=’n’) continue; } return ret_val;}注意
由于所有非零值都是“true”,因此许多有经验的C 程序员会在本例中的main() 中将while 循环头写为: while (strcmp(try, ANSWER))
strcmp() 函数比较字符串,而不是整个数组,这是一个非常好的功能。虽然数组try 占用了40 个字节,而其中存储的’Grant’ 仅占用6 个字节(还有一个放空字符),但strcmp() 函数只会比较try 中第一个空字符之前的部分。因此,您可以使用strcmp() 来比较存储在不同大小的数组中的字符串。
如果用户输入GRANT、grant 或Ulysses S. Grant 会发生什么?程序将通知用户输入错误。为了使程序更加用户友好,必须包含正确答案的所有可能性。您可以在这里使用一些技巧。例如,可以使用#define定义GRANT这样的答案,并编写一个函数将输入内容转换为大写,从而解决大小写问题。然而,还有一些其他形式的错误需要考虑,这些都留给读者。
1. strcmp()的返回值
如果strcmp() 比较的字符串不同,它返回什么值?有关示例程序,请参阅程序compback.c。
/* compback.c — strcmp 返回*/#include stdio.h#include string.hint main(void){ printf(‘strcmp(‘A’, ‘A’) is ‘); printf(‘%dn’, strcmp(‘A’, ‘A’)); printf(‘strcmp(‘A’, ‘B’) 是’); printf(‘%dn’, strcmp(‘A’, ‘B’)); printf( ‘strcmp(‘B’, ‘A’) 是’); printf(‘%dn’, strcmp(‘B’, ‘A’)); printf(‘strcmp(‘C’, ‘A’) 是’) ; printf(‘%dn’, strcmp(‘C’, ‘A’)); printf(‘strcmp(‘Z’, ‘a’) 是’); printf(‘%dn’, strcmp(‘Z’, ‘a’)); printf(‘strcmp(‘苹果’, ‘苹果’) 是’); printf(‘%dn’, strcmp(‘苹果’, ‘苹果’)); return 0;} 在我们的系统中运行这个程序,输出如下:
strcmp(‘A’, ‘A’) 为0
strcmp(‘A’, ‘B’) 为-1
strcmp(‘B’, ‘A’) 为1
strcmp(‘C’, ‘A’) 为1
strcmp(‘Z’, ‘a’) 为-1
strcmp(‘苹果’, ‘苹果’) 是1
strcmp() 将“A”与其自身进行比较并返回0;将“A”与“B”进行比较并返回-1;将’B’ 与’A’ 进行比较并返回1。这表明,如果字母表中的第一个字符串位于第二个字符串之前,则strcmp() 返回负数;否则,strcmp() 返回负数。否则,strcmp() 返回正数。因此,strcmp() 比较“C”和“A”并返回1。其他系统可能返回2,这是两个ASCII 代码之间的差异。 ASCII 标准规定,在字母表中,如果第一个字符串在第二个字符串之前,strcmp() 返回负数;如果两个字符串相同,strcmp() 返回0;如果第一个字符串位于第二个字符串之前,则strcmp() 返回正数。但是,返回的确切值取决于实现。例如,以下是不同实现的输出,它返回两个字符的差异:
strcmp(‘A’, ‘A’) 为0
strcmp(‘A’, ‘B’) 为-1
strcmp(‘B’, ‘A’) 为1
strcmp(‘C’, ‘A’) 是2
strcmp(‘Z’, ‘a’) 为-7
strcmp(‘苹果’, ‘苹果’) 是115
如果两个字符串的前几个字符相同会发生什么?一般来说,strcmp()会依次比较每个字符,直到找到第一对不同的字符。然后返回对应的值。例如,在上面的最后一个示例中,“apples”和“apple”仅在最后一对字符(“apples”中的s 和“apple”中的空字符)不同。因为空字符在ASCII 中排在第一位。字符s 必须跟随在其后面,因此strcmp() 返回正数。
最后一个示例显示strcmp() 比较所有字符,而不仅仅是字母。因此,该函数不是按字母顺序比较,而是根据机器整理顺序进行比较,即根据字符的数值(通常使用ASCII 值)进行比较。在ASCII 中,大写字母在小写字母之前,因此strcmp(‘Z’, ‘a’) 返回负值。
大多数情况下,strcmp()返回的具体值并不重要,我们只关心该值是0还是非0(即比较的两个字符串是否相等)。或者按字母顺序对字符串进行排序,此时您需要知道比较结果是正数、负数还是0。
—————-
注意
strcmp() 函数比较字符串,而不是字符,因此它的参数应该是字符串(例如“apples”和“A”),而不是字符(例如“A”)。但是,char类型实际上是整数类型,因此可以使用关系运算符来比较字符。假设word 是存储在char 类型数组中的字符串,ch 是char 类型变量,则以下语句有效:
if (strcmp(word, ‘quit’)==0) //对字符串使用strcmp() put(‘Bye!’);if (ch==’q’) //对字符使用==put(‘Bye) !’);但是,不要使用ch 或’q’ 作为strcmp() 的参数。
—————-
程序quit_chk.c 使用strcmp() 函数检查程序是否要停止读取输入。
/* quit_chk.c — 某个程序的开始*/#include stdio.h#include string.h#define SIZE 80#define LIM 10#define STOP ‘quit’char * s_gets(char * st, int n);int main(void){ 字符输入[LIM][SIZE];整数ct=0; printf(‘最多输入%d 行(输入quit 退出):n’, LIM); while (ct LIM s_gets(input[ct] , SIZE) !=NULL strcmp(input[ct],STOP) !=0) { ct++; } printf(‘已输入%d 个字符串’, ct);返回0;}char * s_gets(char * st, int n) { char * ret_val;整数i=0; ret_val=fgets(st, n, 标准输入); if (ret_val) { while (st[i] !=’n’ st[i] !=’0′) i++; if (st[i]==’n’) st[i]=’0′; else //必须有words[i]==’0′ while (getchar() !=’n’) continue; } return ret_val ;} 当读取到EOF 字符(在这种情况下s_gets() 返回NULL)、用户输入quit 或输入项到达LIM 时,程序退出。
顺便说一句,有时输入一个空行(即只需按Enter 或Return 键)来表示输入结束会更方便。要实现这个功能,只需修改while循环的条件即可:
while (ct LIM s_gets(input[ct], SIZE) !=NULL input[ct][0] !=’0′)这里,input[ct]是刚刚输入的字符串,input[ct][0]是字符串的第一个字符。如果用户输入空行,s_gets() 将用空字符替换该行的第一个字符(换行符)。因此,使用以下表达式来检测空行:
输入[ct][0]!=’0’2。 strnmp() 函数
strcmp() 函数比较字符串中的字符,直到找到不同的字符,这可能会持续到字符串末尾。 strncmp()函数比较两个字符串时,可以比较字符不同的地方,也可以只比较第三个参数指定的字符数。例如,要查找以“astro”开头的字符串,您可以限制该函数仅查找这5 个字符。程序starsrch.c 演示了该函数的使用。
/* starrch.c — 使用strncmp() */#include stdio.h#include string.h#define LISTSIZE 6int main(){ const char * list[LISTSIZE]={ ‘天文学’, ‘令人震惊’, ‘天体物理学’, ‘排斥’, ‘星光主义’, ‘天文恐惧症’ };整数计数=0;整数我; for (i=0; i LISTSIZE; i++) if (strncmp(list[i],’astro’, 5)==0) { printf(‘Found: %sn’, list[i]); }计数++; printf(‘列表包含%d 个以astro.n 开头的单词’, count);以下是程序的输出:
找到:天文学找到:天体物理学找到:astrophobia该列表包含3个以astro开头的单词。
5 strcpy()和strncpy()函数
如前所述,如果pts1 和pts2 都是指向字符串的指针,则以下语句复制字符串的地址而不是字符串本身:
点2=点1;如果要复制整个字符串,请使用strcpy() 函数。程序copy1.c 要求用户输入以q 开头的单词。程序将输入复制到临时数组中。如果第一个字母是q,则程序调用strcpy() 将整个字符串从临时数组复制到目标数组。 strcpy() 函数相当于字符串赋值运算符。
/* copy1.c — strcpy() demo */#include stdio.h#include string.h //声明strcpy()#define SIZE 40#define LIM 5char * s_gets(char * st, int n);int main (void){ char qwords[LIM][SIZE];字符温度[大小];整数i=0; printf(‘输入%d个以q:n开头的单词’, LIM); while (i LIM s_gets(temp, SIZE)) { if (temp[0] !=’q’) printf(‘%s 不以q!n 开头’, temp); else { strcpy(qwords[i], temp);我++; } } puts(‘这是接受的单词:’); for (i=0; i LIM; i++) put(qwords[i]);返回0;}char * s_gets(char * st, int n){ char * ret_val;整数i=0; ret_val=fgets(st, n, 标准输入); if (ret_val) { while (st[i] !=’n’ st[i] !=’0′) i++; if (st[i]==’n’) st[i]=’0′; else //必须有words[i]==’0′
while (getchar() != ‘n’) continue; } return ret_val;}下面是该程序的运行示例:
Enter 5 words beginning with q:
quackery
quasar
quilt
quotient
no more
no more doesn’t begin with q!
quiz
Here are the words accepted:
quackery
quasar
quilt
quotient
quiz
注意,只有在输入以q开头的单词后才会递增计数器i,而且该程序通过比较字符进行判断:
if (temp[0] != ‘q’)这行代码的意思是:temp中的第1个字符是否是q?当然,也可以通过比较字符串进行判断:
if (strncmp(temp, “q”, 1) != 0)这行代码的意思是:temp字符串和”q”的第1个元素是否相等?
strcpy()的更多属性
strcpy()函数还有两个有用的属性。第一,strcpy()的返回类型是char *,该函数返回的是第1个参数的值,即一个字符的地址。第二,第1个参数不必指向数组的开始。这个属性可用于拷贝数组的一部分。程序清单11.26演示了该函数的这两个属性。
/* copy2.c — strcpy() demo */#include <stdio.h>#include <string.h> // declares strcpy()#define WORDS “beast”#define SIZE 40int main(void){ const char * orig = WORDS; char copy[SIZE] = “Be the best that you can be.”; char * ps; puts(orig); puts(copy); ps = strcpy(copy + 7, orig); puts(copy); puts(ps); return 0;}下面是该程序的输出:
beastBe the best that you can be.Be the beastbeast注意,strcpy()把源字符串中的空字符也拷贝在内。在该例中,空字符覆盖了copy数组中that的第1个t。注意,由于第1个参数是copy + 7,所以ps指向copy中的第8个元素(下标为7)。因此puts(ps)从该处开始打印字符串。
The strcpy() function uses pointers.
更谨慎的选择:strncpy()
strcpy()和strcat()都有同样的问题,它们都不能检查目标空间是否能容纳源字符串的副本。拷贝字符串用strncpy()更安全,该函数的第3个参数指明可拷贝的最大字符数。程序copy3.c用strncpy()代替程序copy1.c中的strcpy()。为了演示目标空间装不下源字符串的副本会发生什么情况,该程序使用了一个相当小的目标字符串(共7个元素,包含6个字符)。
/* copy3.c — strncpy() demo */#include <stdio.h>#include <string.h> /* declares strncpy() */#define SIZE 40#define TARGSIZE 7#define LIM 5char * s_gets(char * st, int n);int main(void){ char qwords[LIM][TARGSIZE]; char temp[SIZE]; int i = 0; printf(“Enter %d words beginning with q:n”, LIM); while (i < LIM && s_gets(temp, SIZE)) { if (temp[0] != ‘q’) printf(“%s doesn’t begin with q!n”, temp); else { strncpy(qwords[i], temp, TARGSIZE – 1); qwords[i][TARGSIZE – 1] = ‘0’; i++; } } puts(“Here are the words accepted:”); for (i = 0; i < LIM; i++) puts(qwords[i]); return 0;}char * s_gets(char * st, int n){ char * ret_val; int i = 0; ret_val = fgets(st, n, stdin); if (ret_val) { while (st[i] != ‘n’ && st[i] != ‘0’) i++; if (st[i] == ‘n’) st[i] = ‘0’; else // must have words[i] == ‘0’ while (getchar() != ‘n’) continue; } return ret_val;}下面是该程序的运行示例:
Enter 5 words beginning with q:
quack
quadratic
quisling
quota
quagga
Here are the words accepted:
quack
quadra
quisli
quota
quagga
strncpy(target, source, n)把source中的n个字符或空字符之前的字符(先满足哪个条件就拷贝到何处)拷贝至target中。因此,如果source中的字符数小于n,则拷贝整个字符串,包括空字符。但是,strncpy()拷贝字符串的长度不会超过n,如果拷贝到第n个字符时还未拷贝完整个源字符串,就不会拷贝空字符。所以,拷贝的副本中不一定有空字符。鉴于此,该程序把n设置为比目标数组大小少1(TARGSIZE-1),然后把数组最后一个元素设置为空字符:
/* compare.c — this will work */#include <stdio.h>#include <string.h> // declares strcmp()#define ANSWER “Grant”#define SIZE 40char * s_gets(char * st, int n);int main(void){ char try[SIZE]; puts(“Who is buried in Grant’s tomb?”); s_gets(try, SIZE); while (strcmp(try,ANSWER) != 0) { puts(“No, that’s wrong. Try again.”); s_gets(try, SIZE); } puts(“That’s right!”); return 0;}char * s_gets(char * st, int n){ char * ret_val; int i = 0; ret_val = fgets(st, n, stdin); if (ret_val) { while (st[i] != ‘n’ && st[i] != ‘0’) i++; if (st[i] == ‘n’) st[i] = ‘0’; else // must have words[i] == ‘0’ while (getchar() != ‘n’) continue; } return ret_val;}这样做确保存储的是一个字符串。如果目标空间能容纳源字符串的副本,那么从源字符串拷贝的空字符便是该副本的结尾;如果目标空间装不下副本,则把副本最后一个元素设置为空字符。
6 sprintf()函数
程序format.c中的程序用sprintf()把3个项(两个字符串和一个数字)组合成一个字符串。注意,sprintf()的用法和printf()相同,只不过sprintf()把组合后的字符串存储在数组formal中而不是显示在屏幕上。
/* format.c — format a string */#include <stdio.h>#define MAX 20char * s_gets(char * st, int n);int main(void){ char first[MAX]; char last[MAX]; char formal[2 * MAX + 10]; double prize; puts(“Enter your first name:”); s_gets(first, MAX); puts(“Enter your last name:”); s_gets(last, MAX); puts(“Enter your prize money:”); scanf(“%lf”, &prize); sprintf(formal, “%s, %-19s: $%6.2fn”, last, first, prize); puts(formal); return 0;}char * s_gets(char * st, int n){ char * ret_val; int i = 0; ret_val = fgets(st, n, stdin); if (ret_val) { while (st[i] != ‘n’ && st[i] != ‘0’) i++; if (st[i] == ‘n’) st[i] = ‘0’; else // must have words[i] == ‘0’ while (getchar() != ‘n’) continue; } return ret_val;}下面是该程序的运行示例:
Enter your first name:
Annie
Enter your last name:
von Wurstkasse
Enter your prize money:
25000
von Wurstkasse, Annie : $25000.00
sprintf()函数获取输入,并将其格式化为标准形式,然后把格式化后的字符串存储在formal中。
7 其他字符串函数
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个字符,就不拷贝空字符。
/* compback.c — strcmp returns */#include <stdio.h>#include <string.h>int main(void){ printf(“strcmp(“A”, “A”) is “); printf(“%dn”, strcmp(“A”, “A”)); printf(“strcmp(“A”, “B”) is “); printf(“%dn”, strcmp(“A”, “B”)); printf(“strcmp(“B”, “A”) is “); printf(“%dn”, strcmp(“B”, “A”)); printf(“strcmp(“C”, “A”) is “); printf(“%dn”, strcmp(“C”, “A”)); printf(“strcmp(“Z”, “a”) is “); printf(“%dn”, strcmp(“Z”, “a”)); printf(“strcmp(“apples”, “apple”) is “); printf(“%dn”, strcmp(“apples”, “apple”)); return 0;}该函数把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字符串首次出现的c字符的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果在字符串s中未找到c字符,该函数则返回空指针。
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是源字符串,不能更改。
关键字restrict 限制了函数参数的用法。例如,不能把字符串拷贝给本身。
size_t类型是sizeof运算符返回的类型。C规定sizeof运算符返回一个整数类型,但是并未指定是哪种整数类型,所以size_t在一个系统中可以是unsignedint,而在另一个系统中可以是unsigned long。string.h头文件针对特定系统定义了size_t,或者参考其他有size_t定义的头文件。
我们来看一下其中一个函数的简单用法。前面学过的fgets()读入一行输入时,在目标字符串的末尾添加换行符。我们自定义的s_gets()函数通过while循环检测换行符。其实,这里可以用strchr()代替s_gets()。首先,使用strchr()查找换行符(如果有的话)。如果该函数发现了换行符,将返回该换行符的地址,然后便可用空字符替换该位置上的换行符:
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/118919.html
用户评论
孤城暮雨
终于找到一篇讲解 C 语言字符串函数的文章了!一直卡在用这些函数的操作上,希望能好好学习一下,毕竟字符串经常用到啊!学习一两个有用的就解决很多问题。
有16位网友表示赞同!
風景綫つ
我以前学的时候完全没有接触过 C语言里的 字符串处理功能,这篇文章讲解的挺详细的,特别是strlen()和strcmp()这两个函数的使用,看了之后感觉对这些基础语法都更清晰了。
有16位网友表示赞同!
﹏櫻之舞﹏
C 语言真是太棒了!字符串操作灵活强大,看完这7个函数,我简直要立刻写代码玩弄它了!感谢作者分享这么实用的知识!
有18位网友表示赞同!
闷骚闷出味道了
说实在的,我看不懂其中的“指针”概念,这个对 C 的理解总是让我头疼,特别是学习这些抽象的概念总是让我感到困惑。希望后续能有更直观的讲解,或者用图示的方式来解释这些函数的原理,这样更容易理解。
有8位网友表示赞同!
打个酱油卖个萌
字符串处理是编程中必不可少的技能之一,这篇文章讲得很到位,涵盖了常用的基本操作,以后遇到类似的问题可以直接参考一下!
有12位网友表示赞同!
如你所愿
哎,感觉这篇博文虽然不错,但对于初学者来说可能还是有点难度,很多概念需要一定的编程基础才能理解。希望作者能针对不同水平的读者写一些循序渐进的文章,这样更友好哦!
有8位网友表示赞同!
傲世九天
学习 C 语言一定要重点掌握 字符串处理 的技巧,这篇文章正好点明了七个关键函数,非常实用,值得收藏备忘!
有18位网友表示赞同!
夏日倾情
我正在学习 C, 这篇博文内容很有价值,帮我学习了如何使用 strcmp 和 strlen ,比看教材要简单易懂多了!
有18位网友表示赞同!
£烟消云散
感觉这篇文章的解释有点浅层,一些复杂的场景没能很好的说明。例如:如何处理超出字符数组大小的情况,或是跨平台字符串解码等等,希望能补充更多深入的内容!
有18位网友表示赞同!
追忆思域。
标题说的“七个函数”,好像就只有 strlen 和 strcmp 这两个吧?其他的没怎么详细介绍。
有19位网友表示赞同!
泡泡龙
这篇博文让我对 C 语言中的字符串处理有了更系统的认识,以前只知道常用的 strlen 函数,现在还学会了 strcmp, strcpy 等其他重要函数的使用方法!
有5位网友表示赞同!
〆mè村姑
学习编程确实需要持续积累和练习,这篇文章虽然帮助我了解了这些基本函数,但我还是要慢慢地去实践运用才能真正掌握。 Thanks!
有20位网友表示赞同!
水波映月
我觉得这篇博文可以再多做一些案例说明,这样更能把内容讲透彻点,也更容易让人理解和记忆。比如用几个简单例子来演示每种函数的用法,会更有说服力!
有15位网友表示赞同!
浮世繁华
字符串处理是一个很庞大的话题啊,这7个函数只是冰山一角,想要真正成为字符串处理高手还需要不断练习和探索更多更高级的技巧!
有11位网友表示赞同!
不要冷战i
C语言确实强大吧?字符串处理能力也这么强悍! 这篇博文让我受益匪浅,看来要好好学习下字符串处理函数的妙用法了!加油!
有8位网友表示赞同!
裸睡の鱼
为什么很多 C 函数都是用指针操作呢?这个部分不太好理解,希望作者能解释清楚。
有17位网友表示赞同!
看我发功喷飞你
学习 C 语言真是需要花时间和思考!这篇文章虽然只是介绍了7个函数,但背后的原理却很复杂。我会认真研究一下代码实现细节,争取彻底搞清楚。
有12位网友表示赞同!