strlen、strcpy、strcat
核心字符串函数
strlen、strcpy、strcat 是 CoddyKit 上的免费 C Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。
C 语言中的字符串
在 C 语言中,字符串其实就是一个以特殊的空终止字符'\0'结尾的char数组。
<string.h>中的函数依靠这个终止符来确定字符串的结束位置。没有它,这些函数就会读到数组末尾之外。
#include <stdio.h>
int main(void) {
char name[] = "Alice";
printf("%s\n", name);
printf("Bytes used: %lu\n", sizeof(name));
return 0;
}包含 string.h
要使用字符串函数,必须包含以下头文件:
#include <string.h>
这样您就可以使用strlen、strcpy、strcat、strcmp等函数。
#include <stdio.h>
#include <string.h>
int main(void) {
char greeting[] = "Hello";
printf("Length is %lu\n", strlen(greeting));
return 0;
}strlen:统计字符数
strlen返回空终止符之前的字符数量,不会计算'\0'本身。
因此,strlen("cat")返回3,即使数组实际占用了 4 个字节。
#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "cat";
printf("strlen = %lu\n", strlen(word));
printf("sizeof = %lu\n", sizeof(word));
return 0;
}strlen 的复杂度为 O(n)
由于 C 字符串不会存储长度,strlen必须逐个遍历字符,直到找到'\0'。
因此它是一个O(n)操作。对于较长的字符串,避免在循环条件中反复调用它。
#include <stdio.h>
#include <string.h>
int main(void) {
char msg[] = "programming";
size_t len = strlen(msg);
for (size_t i = 0; i < len; i++) {
printf("%c", msg[i]);
}
printf("\n");
return 0;
}strcpy:复制字符串
您不能使用=复制字符串。请使用strcpy(dest, src),它会将src复制到dest,包括空终止符。
目标缓冲区必须足够大,以容纳源字符串及其终止符。
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest);
return 0;
}strcpy 的缓冲区溢出风险
如果dest太小,strcpy就会写到缓冲区之外,导致内存损坏。这是一种典型的安全漏洞。
建议使用strncpy(dest, src, n),它最多复制n个字节。注意:如果 src 太长,strncpy可能不会添加空终止符。
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "LongString";
char dest[5];
strncpy(dest, src, 4);
dest[4] = '\0';
printf("%s\n", dest);
return 0;
}strcat:拼接字符串
strcat(dest, src) 会将 src 追加到 dest 的末尾。它从 dest 的空终止符处开始写入,并在末尾添加新的空终止符。
dest 必须已经是有效字符串,并且有足够的剩余空间。
#include <stdio.h>
#include <string.h>
int main(void) {
char buffer[20] = "Hello, ";
strcat(buffer, "World");
printf("%s\n", buffer);
return 0;
}逐步构建字符串
您可以将 strcpy 和 strcat 链式组合,逐段构建字符串。
请始终从已初始化的缓冲区开始,以确保第一次调用 strcat 时能找到有效的终止符。
#include <stdio.h>
#include <string.h>
int main(void) {
char full[50];
strcpy(full, "Mr. ");
strcat(full, "John ");
strcat(full, "Smith");
printf("%s\n", full);
return 0;
}使用 strncat 进行更安全的拼接
strncat(dest, src, n) 最多将 src 中的 n 个字符追加到 dest,然后始终添加空终止符。
当源字符串的长度未知时,这有助于防止溢出。
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[16] = "Data: ";
char src[] = "1234567890";
strncat(dest, src, 5);
printf("%s\n", dest);
return 0;
}返回值
strcpy 和 strcat 都会返回指向 dest 的指针。因此您可以嵌套调用,不过这可能会降低代码的可读性。
strlen 返回 size_t,它是无符号类型。将它与有符号整数比较时请务必小心。
#include <stdio.h>
#include <string.h>
int main(void) {
char a[20] = "foo";
char b[] = "bar";
printf("%s\n", strcat(a, b));
return 0;
}常见的分配陷阱
一个常见错误是在计算缓冲区大小时忘记为空终止符预留 +1。
长度为 n 的字符串需要 n + 1 个字节。两个拼接字符串的总长度为 strlen(a) + strlen(b) + 1。
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "abc";
char b[] = "de";
size_t needed = strlen(a) + strlen(b) + 1;
printf("Need %lu bytes\n", needed);
return 0;
}快速检查
请测试您对字符串长度的理解。
回顾
您已经学习了 string.h 中的核心函数:
- strlen 计算
'\0'之前的字符数(O(n))。 - strcpy 复制字符串;目标区域必须足够大。
- strcat 将内容追加到现有字符串末尾。
- 请始终为空终止符预留空间,并为了安全优先使用
strn*变体。
用 AI 导师学习 C — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 39
- 课程
- 144
常见问题解答
「strlen、strcpy、strcat」课时是免费的吗?
是的 — 「strlen、strcpy、strcat」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。
「strlen、strcpy、strcat」这节课中我会学到什么?
核心字符串函数 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「strlen、strcpy、strcat」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C Academy 课中编写并运行代码吗?
能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- strlen、strcpy、strcat
- strcmp 与比较
- strtok 与分词
- memcpy 与 memset