国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > 字符串 以获得更好的体验。

# C 语言的字符串

字符串是编程中用来表示文本的数据,例如 "你好,世界"

C 语言中没有一个称为“字符串”的“类型”,而是通过字符指针(char*)来指向字符串的开头,通过 0 表示字符串的结尾。

例如:

#include <stdio.h>

int main(void)
{
    const char* ptr = "Hello";  // 定义变量 ptr,指向字符串 "Hello"
    printf("%s\n", ptr);        // 打印字符串    

    return 0;
}

说明:

flowchart TB
    subgraph 内存
        m0["地址:1000 <br/> 值:'H'"]
        m1["地址:1001 <br/> 值:'e'"]
        m2["地址:1002 <br/> 值:'l'"]
        m3["地址:1003 <br/> 值:'l'"]
        m4["地址:1004 <br/> 值:'o'"]
        m5["地址:1005 <br/> 值:'\0'"]
    end
    
    ptr --> m0
  • "Hello" 这样使用双引号(")包含的文本是字符串的字面量

    • 类型为 const char[6],内部存储着 Hello 和用于标记字符串结尾的 0

    • 赋值给 ptr 时隐式转换为指针类型(const char*),值为首个元素(也就是 H)的地址,

    • 不能被修改

  • printf 使用 %s 打印字符串

运行结果:

Hello

# char 数组

可以使用 char 的数组来存储字符串。

#include <stdio.h>

int main(void)
{
    char text[] = "Hello";  // 长度为 6,包含 'H','e','l','l','o' 和结尾的 0
    printf("%s\n", text);   // 打印字符串,text 隐式转换为 char*

    text[0] = 'h';          // 修改第一个字符
    printf("%s\n", text);   // 打印字符串,text 隐式转换为 char*

    return 0;
}

说明:

digraph {
    node [shape=plaintext, fontcolor=red, fontsize=18];
    "text:" [color=white];

    node [shape=record, fontcolor=black, fontsize=14, width=4.75, fixedsize=true];
    values [label="<f0> 'H' | <f1> 'e' | <f2> 'l' | <f3> 'l' | <f4> 'o' | <f5> '\\0'", color=blue, fillcolor=lightblue, style=filled];

    { rank=same; "text:"; values }

    edge [color=blue];
}
  • text 省略了长度,类型为 char[6],包含元素 'H','e','l','l','o' 和结尾的 0

  • printf("%s\n", text);text 隐式转换为 char*

  • text[0] = 'h'; 将第一个元素修改为 'h'

运行结果:

Hello
hello

# 字符串的常用操作

在标准库头文件 string.h 中提供了常用的字符串操作函数。

函数 说明
strlen 获取字符串长度
strcpy 复制字符串
strncpy 复制字符串,不超过指定长度
strcat 拼接字符串
strncat 拼接字符串,不超过指定长度
strcmp 比较字符串
strncmp 比较字符串,不超过指定长度
... 更多

示例:

#include <stdio.h>
#include <string.h>

int main()
{
    const char* str = "hello world";
    char buffer[32];

    // 获取字符串长度
    printf("\"%s\" 的长度为 %zu 字节\n", str, strlen(str));

    // 复制字符串
    strcpy(buffer, str);
    printf("buffer = \"%s\" \n", buffer);

    // 字符串拼接
    strcat(buffer, str);
    printf("buffer = \"%s\" \n", buffer);

    // 比较字符串
    if (strcmp("hello", "world") == 0)
    {
        printf("字符串相同\n");     // 相同返回 0
    }
    else
    {
        printf("字符串不同\n");     // 不同返回非 0
    }
    
    return 0;
}

说明:

  • strlen(str) 从传入的指针位置开始向后扫描,计数字符串长度

  • strcmp(str1, str2) 比较两个字符串是否相同,相同返回 0,不同返回非 0

  • strcpy(dest, src) 将第二个参数指向的字符串复制到第一个参数指向的内存地址

  • strcat(dest, src) 将第二个参数指向的字符串拼接到第一个参数指向的字符串后面

这些函数均以 0 作为字符串的结尾,如果没有标记结尾的 0,将会产生内存越界访问的错误。

运行结果:

"hello world" 的长度为 11 字节
buffer = "hello world"
buffer = "hello worldhello world"
字符串不同
本文 更新于: 2025-11-27 09:38:06 创建于: 2025-11-27 09:38:06