字符串处理函数
在C语言中,字符串是以空字符('\0')结尾的字符数组。C语言没有专门的字符串类型,而是使用字符数组来表示字符串。标准库<string.h>提供了丰富的字符串处理函数。
字符串数组
strlen
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
printf("字符串长度: %zu\n", strlen(str)); // 输出:字符串长度: 13
return 0;
}
strcpy
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello";
char dest[10];
strcpy(dest, src);
printf("复制后的字符串: %s\n", dest); // 输出:复制后的字符串: Hello
return 0;
}
-
将源字符串复制到目标字符串
-
返回值:目标字符串的指针
-
注意:确保目标字符串有足够空间,否则会导致缓冲区溢出
strncpy
-
复制指定长度的字符串
-
返回值:目标字符串的指针
-
注意:如果源字符串长度小于n,则用'\0'填充目标字符串;如果源字符串长度大于等于n,则不会自动添加'\0'
#include <stdio.h> #include <string.h> int main() { char src[] = "Hello, World!"; char dest[10]; strncpy(dest, src, 5); dest[5] = '\0'; // 手动添加结束符 printf("复制后的字符串: %s\n", dest); // 输出:复制后的字符串: Hello return 0; }字符串连接函数
strcat
-
将源字符串连接到目标字符串末尾
-
返回值:目标字符串的指针
-
注意:确保目标字符串有足够空间
#include <stdio.h> #include <string.h> int main() { char dest[20] = "Hello, "; char src[] = "World!"; strcat(dest, src); printf("连接后的字符串: %s\n", dest); // 输出:连接后的字符串: Hello, World! return 0; }strncat
将源字符串的前n个字符连接到目标字符串末尾,自动添加'\0'结束符
#include <stdio.h> #include <string.h> int main() { char dest[20] = "Hello, "; char src[] = "World!"; strncat(dest, src, 3); printf("连接后的字符串: %s\n", dest); // 输出:连接后的字符串: Hello, Wor return 0; }strcmp
-
如果str1 < str2,返回负值
-
如果str1 == str2,返回0
-
如果str1 > str2,返回正值
#include <stdio.h> #include <string.h> int main() { char str1[] = "apple"; char str2[] = "banana"; int result = strcmp(str1, str2); if (result < 0) { printf("str1 小于 str2\n"); } else if (result > 0) { printf("str1 大于 str2\n"); } else { printf("str1 等于 str2\n"); } return 0; }strncmp
-
比较两个字符串的前n个字符
#include <stdio.h> #include <string.h> int main() { char str1[] = "apple"; char str2[] = "application"; int result = strncmp(str1, str2, 3); if (result == 0) { printf("前3个字符相同\n"); // 输出:前3个字符相同 } else { printf("前3个字符不同\n"); } return 0; }字符串查找函数
-
strchr
-
在字符串中查找第一次出现指定字符的位置
-
返回值:指向第一次出现该字符的指针,如果未找到则返回NULL
-
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World!"; char *p = strchr(str, 'o'); if (p != NULL) { printf("字符'o'在字符串中的位置: %ld\n", p - str); // 输出:字符'o'在字符串中的位置: 4 printf("从该位置开始的子串: %s\n", p); // 输出:从该位置开始的子串: o, World! } else { printf("未找到字符'o'\n"); } return 0; }strrchr
-
在字符串中查找最后一次出现指定字符的位置
-
返回值:指向最后一次出现该字符的指针,如果未找到则返回NULL
-
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World!"; char *p = strrchr(str, 'o'); if (p != NULL) { printf("字符'o'最后出现的位置: %ld\n", p - str); // 输出:字符'o'最后出现的位置: 8 } return 0; }strstr
-
在字符串中查找子串第一次出现的位置
-
返回值:指向子串第一次出现的指针,如果未找到则返回NULL
#include <stdio.h>
#include <string.h>
int main() {
char haystack[] = "Hello, World!";
char needle[] = "World";
char *p = strstr(haystack, needle);
if (p != NULL) {
printf("子串在原字符串中的位置: %ld\n", p - haystack); // 输出:子串在原字符串中的位置: 7
printf("找到的子串及其后面的内容: %s\n", p); // 输出:找到的子串及其后面的内容: World!
} else {
printf("未找到子串\n");
}
return 0;
}
字符串转换数字函数
atoi, atof, atol
-
将字符串转换为整数、浮点数或长整数
-
返回值:转换后的数值
#include <stdio.h> #include <stdlib.h> int main() { char str1[] = "123"; char str2[] = "3.14159"; char str3[] = "10000000"; int i = atoi(str1); double f = atof(str2); long l = atol(str3); printf("整数: %d\n", i); // 输出:整数: 123 printf("浮点数: %f\n", f); // 输出:浮点数: 3.141590 printf("长整数: %ld\n", l); // 输出:长整数: 10000000 return 0; }strtol, strtod, strtoul
-
更安全的字符串转换函数,可以指定进制,并可以获取转换结束的位置
-
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "1234.56abc"; char *endptr; long l = strtol(str, &endptr, 10); printf("转换的整数: %ld\n", l); // 输出:转换的整数: 1234 printf("转换结束的位置: %s\n", endptr); // 输出:转换结束的位置: .56abc double d = strtod(str, &endptr); printf("转换的浮点数: %f\n", d); // 输出:转换的浮点数: 1234.560000 printf("转换结束的位置: %s\n", endptr); // 输出:转换结束的位置: abc return 0; }内存操作函数
memcpy
-
复制指定字节数的内存内容
-
返回值:目标内存的指针
#include <stdio.h> #include <string.h> int main() { char src[] = "Hello, World!"; char dest[20]; memcpy(dest, src, strlen(src) + 1); // +1 是为了复制结束符'\0' printf("复制后的字符串: %s\n", dest); // 输出:复制后的字符串: Hello, World! return 0; }memmove
-
类似memcpy,但可以处理源和目标内存重叠的情况
-
返回值:目标内存的指针
-
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World!"; // 将"Hello, "后面的内容移到前面,覆盖"Hello, " memmove(str, str + 7, strlen(str) - 6); printf("移动后的字符串: %s\n", str); // 输出:移动后的字符串: World! return 0; }memset
将指定内存区域填充为指定的值
#include <stdio.h>
#include <string.h>
int main() {
char str[20] = "Hello, World!";
// 将前5个字符设置为'*'
memset(str, '*', 5);
printf("设置后的字符串: %s\n", str); // 输出:设置后的字符串: *****, World!
return 0;
}
memcmp
-
比较两个内存区域的前n个字节
-
返回值:与strcmp类似
#include <stdio.h> #include <string.h> int main() { char str1[] = "Hello"; char str2[] = "Helpo"; int result = memcmp(str1, str2, 3); if (result == 0) { printf("前3个字节相同\n"); // 输出:前3个字节相同 } else { printf("前3个字节不同\n"); } result = memcmp(str1, str2, 5); if (result == 0) { printf("前5个字节相同\n"); } else { printf("前5个字节不同\n"); // 输出:前5个字节不同 } return 0; }字符串分割函数
strtok
-
将字符串分割成一系列标记(tokens)
-
返回值:指向当前标记的指针,如果没有更多标记则返回NULL
-
注意:strtok会修改原字符串,将分隔符替换为'\0'
-
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello,World,C,Programming"; char *token; // 获取第一个标记 token = strtok(str, ","); // 继续获取剩余的标记 while (token != NULL) { printf("标记: %s\n", token); token = strtok(NULL, ","); } return 0; }安全字符函数
-
strcpy_s, strcat_s, strncpy_s, strncat_s
-
安全版本的字符串复制和连接函数
-
返回值:成功返回0,失败返回非零错误码
#include <stdio.h> #include <string.h> int main() { char dest[10]; // 安全复制,指定目标缓冲区大小 if (strcpy_s(dest, sizeof(dest), "Hello") == 0) { printf("复制成功: %s\n", dest); } else { printf("复制失败\n"); } // 安全连接,指定目标缓冲区大小 if (strcat_s(dest, sizeof(dest), ", World") == 0) { printf("连接成功: %s\n", dest); } else { printf("连接失败,可能是缓冲区太小\n"); } return 0; }
更多推荐


所有评论(0)