4088

20 分钟

#C 语言的字符串

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

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

例如:

#include <stdio.h> int main(void) { const char* ptr = "Hello"; // 定义变量 ptr,指向字符串 "Hello" printf("%s\n", ptr); // 打印字符串 return 0; }

说明:

内存

地址:1000
值:'H'

地址:1001
值:'e'

地址:1002
值:'l'

地址:1003
值:'l'

地址:1004
值:'o'

地址:1005
值:'\0'

ptr

  • "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; }

说明:

text: text: values 'H' 'e' 'l' 'l' 'o' '\0'
  • 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/7/6

更新于 2025/7/21