#C 语言的字符串
字符串是编程中用来表示文本的数据,例如 "你好,世界"
。
C 语言中没有一个称为“字符串”的“类型”,而是通过字符指针(char*
)来指向字符串的开头,通过 0 表示字符串的结尾。
例如:
#include <stdio.h>
int main(void)
{
const char* ptr = "Hello"; // 定义变量 ptr,指向字符串 "Hello"
printf("%s\n", ptr); // 打印字符串
return 0;
}
说明:
"Hello"
这样使用双引号("
)包含的文本是字符串的字面量- 类型为
const char[6]
,内部存储着H
,e
,l
,l
,o
和用于标记字符串结尾的 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
省略了长度,类型为char[6]
,包含元素 'H','e','l','l','o' 和结尾的 0printf("%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" 字符串不同