常见字符函数和字符串函数(下)

1. strncpy 函数的使用

  • 的前 number 个字符复制到目标。如果在复制 num 个字符之前找到 C 字符串的末尾(由 null 字符表示),则目标将填充零,直到写入总数 num 个字符为止。
  • 如果 source 长于 num,则不会在 destination 的末尾隐式附加 null 字符。因此,在这种情况下, destination 不应被视为以 null 结尾的 C 字符串(因此读取它会溢出)。
  • destination 和 source 不应重叠 
  • 目标空间必须可修改并且足够大,否则会引起报错。

示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str1[] = "Hello ";
6.  	char str2[20] = { 1,2,3,4,5,6,7,8,9,10 };
7.  	strncpy(str2, str1, 7);
8.  	printf("%s\n", str2);
9.  	return 0;
10. }

如图,调试后发现当num大于原空间字符串长度后,会在其后追加0,直到长度等于num。

2. strncat函数的使用

 

  • 将 source 的前 num 个字符附加到 destination,外加一个终止 null 字符。
  • 如果 source 中 C 字符串的长度小于 num,则仅复制终止 null 字符之前的内容。 
  • 目标空间必须可修改并且足够大,否则会引起报错。

示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str1[20];
6.  	char str2[20];
7.  	strcpy(str1, "To be ");
8.  	strcpy(str2, "or not to be");
9.  	strncat(str1, str2, 6);
10. 	printf("%s\n", str1);
11. 	return 0;
12. }

3. strncmp函数的使用 

  • 比较 C 字符串 str1 的字符数与 C 字符串 str2 的字符数。
  • 此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续处理以下对,直到字符不同,直到到达终止 null 字符,或者直到两个字符串中的 num 个字符匹配,以先发生者为准。

 示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str1[20] = "abcdef";
6.  	char str2[20] = "abcdeg";
7.  	int ret = strncmp(str1, str2, 4);
8.  	int sag = strcmp(str1, str2);
9.  	printf("%d\n", ret);
10. 	printf("%d\n", sag);
11. 	return 0;
12. }

图中strncmp函数规定了仅仅只比较前四个字符,所以他是相等的,返回值为0;而strcmp函数则是全部比较,两个字符串中的字符串逐个进行比较,所以返回值为小于0的数。

4. strstr的使用和模拟实现 

  • 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
  • 匹配过程不包括终止 null 字符,但会在此处停止。

示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str[] = "My name is LiMing ! And you?";
6.  	char *s=strstr(str, "LiMing");
7.  	printf("%s\n", s);
8.  	return 0;
9.  }

由示例代码和图像可知:其返回的是出现目标字符的地址。

strstr函数的模拟实现 :

1.  char* strstr(const char* str1, const char* str2)
2.  {
3.  	char* cp = (char*)str1;
4.  	char* s1, * s2;
5.  	if (!*str2)
6.  	{
7.  		return ((char*)str1);
8.  	}
9.  	while (*cp)
10. 	{
11. 		s1 = cp;
12. 		s2 = (char*)str2;
13. 		while (*s1 && *s2 && !(*s1 - *s2))
14. 		{
15. 			s1++, s2++;
16. 		}
17. 		if (!*s2)
18. 		{
19. 			return (cp);
20. 		}
21. 		cp++;
22. 	}
23.     return NULL;
24. }

由代码可知:我们设定的规则是如果我们给定的字符串为空,即查找字符串为空,直接返回源字符串的地址;while循环进入的条件设定的是两个字符串军不为空并且起始字符相等,然后开始遍历,出循环后,如果查找字符串为空,则说明找到了,若不为空,则说明查找到到的部分和要查找的字符串虽然有重叠之处,但并不完全重合,也就证明不是,再继续进行查找。

5. strtok函数的使用

  • 对此函数的一系列调用将 str 拆分为标记,这些标记是由分隔符中的任何字符分隔的连续字符序列。
  • 在第一次调用时,该函数需要一个 C 字符串作为 str 的参数,其第一个字符用作扫描标记的起始位置。在后续调用中,该函数需要一个 null 指针,并使用最后一个标记结束后的位置作为扫描的新起始位置。
  • 为了确定令牌的开头和结尾,该函数首先从起始位置扫描分隔符中未包含的第一个字符(该字符将成为令牌的开头)。然后从令牌的开头开始扫描分隔符中包含的第一个字符,该字符将成为令牌的结尾。如果找到终止 null 字符,扫描也会停止。
  • 令牌的此结尾将自动替换为 null 字符,令牌的开头由函数返回。
  • 在对 strtok 的调用中找到 str 的终止 null 字符后,对此函数的所有后续调用(以 null 指针作为第一个参数)都将返回 null 指针。

 示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char arr[] = "192.168.6.111";
6.  	char* sep = ".";
7.  	char* str = NULL;
8.  	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
9.  	{
10. 		printf("%s\n", str);
11. 	}
12. 	return 0;
13. }

 6. strerror函数的使用

  • 解释 errnum 的值,生成一个字符串,其中包含一条消息,该消息描述错误条件。
  • strerror函数可以把参数部分对应错误码对应的错误信息的字符串地址返回来。
  • 在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

示例1:

1.  #include<stdio.h>
2.  #include<string.h>
3.  #include<errno.h>
4.  int main()
5.  {
6.  
7.  	for (int i = 0; i <= 10; i++)
8.  	{
9.  		printf("%s\n", strerror(i));
10. 	}
11. 	return 0;
12. }

打印结果如下: 

1.  No error
2.  Operation not permitted
3.  No such file or directory
4.  No such process
5.  Interrupted function call
6.  Input/output error
7.  No such device or address
8.  Arg list too long
9.  Exec format error
10. Bad file descriptor
11. No child processes

示例2:

1.  #include<stdio.h>
2.  #include<string.h>
3.  #include<errno.h>
4.  int main()
5.  {
6.  	FILE* pFile;
7.  	pFile = fopen("unexist.ent", "r");
8.  	if (pFile == NULL)
9.  	{
10.  		printf("Error qpening file unexist.ent: %s\n", strerror(errno));
11. 	}
12. 	return 0;
13. }

输出:

1.  Error qpening file unexist.ent: No such file or directory

也可以使用perror函数,perror函数相当于一次将上述代码中的第10行完成了,直接将错误信息打印出来。perror函数打印出来完参数部分的字符串后,再打印一个冒号和空格,再打印错误信息。

1.  #include<stdio.h>
2.  #include<string.h>
3.  #include<errno.h>
4.  int main()
5.  {
6.  	FILE* pFile;
7.  	pFile = fopen("unexist.ent", "r");
8.  	if (pFile == NULL)
9.  	{
10. 		perror("Error qpening file unexist.ent");
11. 	}
12. 	return 0;
13. }

输出:

1.  Error qpening file unexist.ent: No such file or directory

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值