3,165
社区成员




在C语言中,字符串是以字符数组的形式表示的,并以空字符('\0'
)作为结束标志。标准库提供了一系列用于处理字符串的函数,这些函数定义在头文件 <string.h>
中。下面是一些常用的字符串函数及其模拟实现,一起来看看吧。
那接下来就让我们开始遨游在知识的海洋!
在C语言中,字符串是以字符数组的形式表示的,并以空字符('\0'
)作为结束标志。标准库提供了一系列用于处理字符串的函数,这些函数定义在头文件 <string.h>
中。下面是一些常用的字符串函数及其模拟实现:
功能: 返回字符串的长度(不包括终止的空字符)。
原型: size_t strlen(const char *str);
模拟实现:
#include <stdio.h>
size_t my_strlen(const char *str) {
const char *s = str;
while (*s != '\0') {
++s;
}
return s - str;
}
int main() {
char str[] = "Hello, World!";
printf("Length of '%s' is %zu
", str, my_strlen(str));
return 0;
}
功能: 将源字符串复制到目标字符串中。
原型: char *strcpy(char *dest, const char *src);
模拟实现:
#include <stdio.h>
char* my_strcpy(char *dest, const char *src) {
char *d = dest;
while ((*d++ = *src++) != '\0');
return dest;
}
int main() {
char src[] = "Hello, Copy!";
char dest[50]; // 确保目标数组有足够的空间
my_strcpy(dest, src);
printf("Copied string: %s
", dest);
return 0;
}
功能: 将源字符串连接到目标字符串的末尾。
原型: char *strcat(char *dest, const char *src);
模拟实现:
#include <stdio.h>
char* my_strcat(char *dest, const char *src) {
char *d = dest;
while (*d != '\0') {
d++;
}
while ((*d++ = *src++) != '\0');
return dest;
}
int main() {
char str1[50] = "Hello, ";
char str2[] = "World!";
my_strcat(str1, str2);
printf("Concatenated string: %s
", str1);
return 0;
}
功能: 按字典顺序比较两个字符串。
原型: int strcmp(const char *str1, const char *str2);
str1
小于 str2
。 str1
等于 str2
。 str1
大于 str2
。 模拟实现:
#include <stdio.h>
int my_strcmp(const char *str1, const char *str2) {
while (*str1 && (*str1 == *str2)) {
str1++;
str2++;
}
return *(unsigned char *)str1 - *(unsigned char *)str2;
}
int main() {
char str1[] = "apple";
char str2[] = "Apple";
int result = my_strcmp(str1, str2);
if (result < 0) {
printf("%s is less than %s
", str1, str2);
} else if (result > 0) {
printf("%s is greater than %s
", str1, str2);
} else {
printf("%s is equal to %s
", str1, str2);
}
return 0;
}
在C语言中,字符串处理是一个常见的任务,而标准库提供了一系列函数来简化这些操作。尽管像strlen
、strcmp
和strcpy
这样的函数广为人知且频繁使用,但还有一些不那么常见但仍然非常有用的字符串函数。以下是对一些不常见的C语言字符串函数的介绍和使用示例:
功能:检索子串在字符串中首次出现的位置。
头文件:<string.h>
用法:char *strstr(char *str, char *substr);
str
:要检索的字符串。 substr
:要检索的子串。 返回值:返回字符串str
中第一次出现子串substr
的地址;如果没有找到子串,则返回NULL
。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char a[] = "abcdefg";
char b[] = "bc";
char *ret = strstr(a, b);
if (ret == NULL) {
printf("Can not find!
");
} else {
printf("%s
", ret); // 输出 bcdefg
}
return 0;
}
功能:从字符串读取格式化输入。
头文件:<stdio.h>
用法:int sscanf(const char *str, const char *format, ...);
str
:输入的字符串。 format
:格式字符串,指定后续参数的类型和如何解释输入字符串。 返回值:成功转换并赋值的项数;如果到达文件末尾或发生读错误,则返回一个负值。
示例:
#include <stdio.h>
int main() {
char buf[512] = {0};
sscanf("123456", "%s", buf);
printf("%s
", buf); // 输出 123456
return 0;
}
功能:查找字符串中首次出现的字符。
头文件:<string.h>
用法:char *strchr(char *str, char ch);
str
:要搜索的字符串。 ch
:要查找的字符。 返回值:返回指向首次出现字符ch
的位置的指针;如果未找到该字符,则返回NULL
。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char ch = 'W';
char *pos = strchr(str, ch);
if (pos != NULL) {
printf("Character '%c' found at position: %ld
", ch, pos - str);
} else {
printf("Character '%c' not found.
", ch);
}
return 0;
}
功能:连接两个字符串,最多复制n个字符。
头文件:<string.h>
用法:char *strncat(char *dest, const char *src, size_t n);
dest
:目标字符串。 src
:源字符串。 n
:要从src
复制到dest
的最大字符数。 返回值:返回目标字符串dest
的指针。
注意事项:确保目标字符串有足够的空间来容纳连接后的结果。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!!!";
strncat(dest, src, 5); // 只连接前5个字符
printf("%s
", dest); // 输出 Hello, World
return 0;
}
功能:比较两个字符串的前n个字符。
头文件:<string.h>
用法:int strncmp(const char *s1, const char *s2, size_t n);
s1
, s2
:要比较的字符串。 n
:要比较的字符数。 返回值:小于0表示s1
小于s2
;等于0表示两者相等(在前n个字符内);大于0表示s1
大于s2
。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Apple";
char str2[] = "Banana";
int result = strncmp(str1, str2, 4); // 比较前4个字符
if (result < 0) {
printf("str1 is less than str2 in the first 4 characters.
");
} else if (result > 0) {
printf("str1 is greater than str2 in the first 4 characters.
");
} else {
printf("The first 4 characters of str1 and str2 are equal.
");
}
return 0;
}
strtok
是 C 标准库中的一个字符串处理函数,用于将字符串分割成一系列的“标记”(tokens)。这个函数在处理和分析以特定分隔符(delimiter)分隔的字符串时非常有用。例如,解析 CSV 文件、命令行参数或任何需要按特定字符分割的文本数据。
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr); // 线程安全版本,POSIX标准
str
: 要分割的字符串。首次调用时传入要处理的字符串;后续调用应传入 NULL 以继续从上次停止的地方开始分割。 delim
: 包含所有用作分隔符的字符集合。 saveptr
(仅在 strtok_r
中): 一个指向 char*
的指针,用于保存状态信息以便在多次调用之间保持连续性(线程安全)。 以下是一个简单的例子,演示如何使用 strtok
来分割一个包含逗号分隔值的字符串:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana,cherry,date";
const char delim[2] = ",";
char *token;
// 获取第一个标记
token = strtok(str, delim);
// 循环获取后续的标记,直到没有更多的标记为止
while (token != NULL) {
printf("Token: %s
", token);
token = strtok(NULL, delim); // 注意这里传入的是 NULL
}
return 0;
}
Token: apple
Token: banana
Token: cherry
Token: date
strtok
会修改传入的原始字符串,用空字符 ('\0'
) 替换分隔符。因此,如果需要保留原始字符串,应在调用 strtok
之前对其进行复制。strtok
不是线程安全的,因为它使用一个静态变量来存储上下文信息。在多线程环境中,应该使用 POSIX 提供的 strtok_r
函数,它接受一个额外的参数来保存状态信息,从而避免竞态条件。NULL
作为 str
参数以继续分割操作。str
是一个空字符串,strtok
将立即返回 NULL
而不会修改 str
。文章来源: https://blog.csdn.net/z15879084549/article/details/145301612
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。