C语言中没有内置的string类型,我们常说的string在C语言中是通过字符数组或者指向字符的指针来表示的,字符串的本质是连续存储的字符序列,并且以空字符' '作为结束标志,这个结束符是判断字符串长度、进行字符串操作的关键依据。

C语言中字符串的定义方式
字符数组定义字符串
这是最常用的定义字符串的方式,我们可以直接初始化字符数组,编译器会自动在末尾添加' '结束符,也可以手动指定数组大小,但要注意预留结束符的位置。
#include <stdio.h>
int main() {
// 自动添加结束符,数组长度为6(5个字符+1个' ')
char str1[] = "hello";
// 手动指定大小,要确保最后一个元素是' '
char str2[6] = {'h', 'e', 'l', 'l', 'o', ' '};
// 如果数组大小大于字符串长度,剩余位置会被初始化为' '
char str3[10] = "hi";
printf("str1: %sn", str1);
printf("str2: %sn", str2);
printf("str3: %sn", str3);
return 0;
}
字符指针指向字符串
我们也可以用一个字符指针指向字符串常量,这种方式定义的字符串存储在只读数据区,不能被修改,尝试修改会导致程序运行错误。
#include <stdio.h>
int main() {
// 指针指向字符串常量,内容不可修改
char *str = "hello world";
printf("str: %sn", str);
// 下面这行代码会导致运行时错误,不要这样写
// str[0] = 'H';
return 0;
}
常见的字符串操作
字符串输入输出
我们可以使用printf配合%s格式符输出字符串,使用scanf配合%s输入字符串,不过scanf遇到空格就会停止读取,如果需要读取带空格的字符串可以使用fgets函数。
#include <stdio.h>
int main() {
char str[100];
printf("请输入字符串:");
// 读取带空格的字符串,stdin是标准输入流,100是最大读取长度
fgets(str, 100, stdin);
// fgets会把换行符也读入,这里可以去掉末尾的换行符
int i = 0;
while (str[i] != ' ') {
if (str[i] == 'n') {
str[i] = ' ';
break;
}
i++;
}
printf("你输入的字符串是:%sn", str);
return 0;
}
字符串遍历
因为字符串以' '结尾,我们可以通过循环遍历字符直到遇到结束符,来获取字符串的每个字符或者计算字符串长度。
#include <stdio.h>
int main() {
char str[] = "hello";
int len = 0;
// 遍历字符串计算长度
while (str[len] != ' ') {
printf("第%d个字符:%cn", len + 1, str[len]);
len++;
}
printf("字符串长度:%dn", len);
return 0;
}
标准库常用字符串函数
C语言标准库string.h提供了很多现成的字符串处理函数,不需要我们手动实现基础操作,使用前需要包含这个头文件。
| 函数名 | 功能说明 | 使用示例 |
|---|---|---|
| strlen | 计算字符串长度,不包含结束符' ' | int len = strlen("hello"); // len值为5 |
| strcpy | 将源字符串复制到目标字符串,目标空间要足够大 | strcpy(dest, src); |
| strcat | 将源字符串追加到目标字符串末尾,目标空间要足够大 | strcat(dest, src); |
| strcmp | 比较两个字符串,相等返回0,前者大返回正数,后者大返回负数 | int res = strcmp(str1, str2); |
下面是这些函数的综合使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[50] = "hello";
char str2[] = " world";
char str3[50];
// 复制字符串
strcpy(str3, str1);
printf("复制后str3:%sn", str3);
// 拼接字符串
strcat(str1, str2);
printf("拼接后str1:%sn", str1);
// 比较字符串
int cmp_res = strcmp(str3, "hello");
if (cmp_res == 0) {
printf("str3和hello相等n");
}
// 计算长度
printf("str1长度:%lun", strlen(str1));
return 0;
}
注意事项
- 字符数组定义字符串时,数组大小要大于等于字符串长度加1,预留' '的位置,否则会导致字符串操作越界出错。
- 字符指针指向字符串常量时,不要尝试修改指针指向的内容,否则会引发未定义行为。
- 使用
strcpy、strcat等函数时,要确保目标数组有足够的空间容纳结果,避免缓冲区溢出。 - 如果字符串中包含中文等多字节字符,
strlen计算的是字节数而不是字符数,需要根据编码规则处理。