【C语言】(15)字符串标准库常用函数
1. strcpy - 复制字符串
strcpy(destination, source)
函数用于将 source
字符串复制到 destination
字符串。这会包括终止的空字符 '\0'
。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char src[40] = "This is source";
char dest[100];
strcpy(dest, src);
printf("%s", dest);
return 0;
}
2. strcat - 连接字符串
strcat(destination, source)
函数将 source
字符串连接到 destination
字符串的末尾,并覆盖 destination
的终止空字符 '\0'
,最后再添加一个新的终止空字符。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("%s", dest);
return 0;
}
3. strlen - 计算字符串长度
strlen(str)
函数计算字符串 str
的长度,直到但不包括终止的空字符。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char myString[] = "Hello, world!";
printf("字符串长度: %lld", strlen(myString));
return 0;
}
4. strcmp - 比较两个字符串
strcmp
函数的作用是逐个字符比较两个字符串,直到遇到第一个不同的字符或遇到字符串的终止符 \0
为止。
- 使用
strcmp
函数时,确保两个字符串都是以\0
结尾的,否则可能会导致未定义行为。 - 由于
strcmp
函数是根据ASCII值进行比较的,所以它是区分大小写的。如果需要进行不区分大小写的比较,可以使用strcasecmp
或_stricmp
函数(这取决于编译器和平台)。
int strcmp(const char *str1, const char *str2);
返回值
- 如果
str1
和str2
字符串相等,返回0
。 - 如果
str1
字符串大于str2
字符串(按字典顺序),返回一个大于0
的值。 - 如果
str1
字符串小于str2
字符串(按字典顺序),返回一个小于0
的值。
字符串比较的规则
字符串的比较是基于字符串中字符的ASCII值进行的。strcmp
函数从两个字符串的第一个字符开始比较,逐个字符地向后比较,直到发现不同的字符或者到达字符串的末尾(\0
字符)。
比较的过程中,如果两个字符串中的字符在某个位置不相等,strcmp
会根据这两个字符的ASCII值差异来决定返回值。如果 str1
中的字符ASCII值大于 str2
中相应位置的字符的ASCII值,strcmp
函数返回正值;如果小于,返回负值。
示例代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello";
char str2[] = "hello";
char str3[] = "hell";
char str4[] = "world";
printf("strcmp(str1, str2) = %d\n", strcmp(str1, str2)); // 输出:0
printf("strcmp(str1, str3) = %d\n", strcmp(str1, str3)); // 输出:1
printf("strcmp(str3, str1) = %d\n", strcmp(str3, str1)); // 输出:-1
printf("strcmp(str1, str4) = %d\n", strcmp(str1, str4)); // 输出:-1
return 0;
}
在这个示例中:
strcmp(str1, str2)
比较的是两个相同的字符串,所以返回0
。strcmp(str1, str3)
中str1
比str3
多一个字符 ‘o’,在ASCII码表中 ‘o’ 的值大于\0
(str3
的终止字符),所以返回正值。strcmp(str3, str1)
是上述比较的相反情况,所以返回负值。strcmp(str1, str4)
中,第一个不同的字符是 ‘h’ 和 ‘w’,在ASCII码表中 ‘h’ 的值小于 ‘w’,所以返回负值。
5. strchr - 搜索字符在字符串中的首次出现
strchr(str, c)
函数搜索字符 c
第一次出现在字符串 str
中的位置。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "This is a sample string";
char* pch;
//通过strchr函数查找全部的字符‘s’
pch = strchr(str, 's');
while (pch != NULL) {
printf("位置在 %lld\n", pch - str + 1);
pch = strchr(pch + 1, 's');
}
return 0;
}
6. strstr - 搜索子字符串
strstr(str, substr)
函数搜索子字符串 substr
第一次出现在字符串 str
中的位置。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "This is a simple string,so simple";
char* pch;
pch = strstr(str, "simple");
while (pch != NULL) {
printf("位置在 %lld\n", pch - str + 1);
pch = strstr(pch+1, "simple");
}
return 0;
}
7. strncpy - 复制指定长度的字符串
strncpy(dest, src, n)
函数用于将最多 n
个字符复制到 dest
,如果 src
的长度小于 n
,则剩余的部分将用空字符填充。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char src[40]="Hello, World!"; // 未初始化的数组元素是未定义的
char dest[25];
strncpy(dest, src, sizeof(dest));
dest[sizeof(dest) - 1] = '\0'; // 确保字符串结尾是 '\0'
printf("%s\n", dest); // Hello, World!
printf("字符串长度:%lld\n", strlen(dest)); // 13
char dest2[10];
strncpy(dest2, src, sizeof(dest2));
dest2[sizeof(dest2) - 1] = '\0'; // 确保字符串结尾是 '\0'
printf("%s\n", dest2); // Hello, Wo
printf("字符串长度:%lld\n", strlen(dest2)); // 8
return 0;
}
8. strncat - 连接指定长度的字符串
strncat(dest, src, n)
函数将最多 n
个字符连接到 dest
的末尾。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strncat(dest, src, 5);
printf("最终字符串 : |%s|", dest);
return 0;
}
9. strncmp - 比较指定长度的两个字符串
strncmp(str1, str2, n)
函数比较两个字符串的前 n
个字符。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello World!";
char str2[] = "Hello World2!";
if (strncmp(str1, str2, 11) == 0) {
printf("前11位是相等的");
}
return 0;
}
10. strtok - 分割字符串
strtok(str, delim)
函数用于将字符串 str
根据分隔符 delim
分割成一系列的标记(token)。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char str[] ="hi- This, a sample string.lll";
char * pch;
pch = strtok(str, " ,.-");
while (pch != NULL) {
printf("%s\n", pch);
pch = strtok(NULL, " ,.-");
}
return 0;
}
11. strerror - 获取错误消息字符串
用于将错误编号转换为对应的错误消息字符串。在处理系统调用或库函数失败时,它可以帮助程序员理解发生了什么错误。
- 不要修改
strerror
返回的字符串。该字符串可能指向静态分配的内存,对其的任何修改都是未定义行为。 - 在多线程程序中使用
strerror
需要小心,因为它可能返回指向静态分配内存的指针,这可能导致数据竞争。为了解决这个问题,一些系统提供了strerror_r
函数,它是线程安全的版本。
函数原型
char *strerror(int errnum);
参数
errnum
:错误编号。这通常是全局变量errno
的当前值,errno
在<errno.h>
头文件中定义,其值在系统调用或库函数发生错误时被设置。
返回值
strerror
函数返回一个指向错误消息字符串的指针。这个字符串描述了参数errnum
对应的错误。
示例代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
FILE* fp;
// 尝试打开一个不存在的文件
fp = fopen("nonexistent_file.txt", "r");
if (fp == NULL) {
// 使用 strerror 输出错误消息
printf("Error opening file: %s\n", strerror(errno));
}
return 0;
}
在这个示例中,尝试打开一个不存在的文件会导致 fopen
函数失败,并设置 errno
为对应的错误编号。然后,strerror
函数被用来获取这个错误编号的文本描述,并打印出来。这对于调试和错误处理非常有帮助。
常见用法
- 在处理文件操作、网络通信、内存分配等可能失败的系统调用或标准库函数后,使用
strerror
来获取失败的具体原因。 - 在日志记录或错误报告中,提供比简单的错误编号更具可读性的错误信息。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/229310.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!