C Academy · 课时

strlen、strcpy、strcat

核心字符串函数

第 1 / 4 课13 个步骤

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. strlen、strcpy、strcat
  2. strcmp 与比较
  3. strtok 与分词
  4. memcpy 与 memset
← 返回 C Academy