C语言:字符串
在C语言中,字符串是一个字符数组,以 空字符(\0) 结尾表示字符串的结束。这种实现方式使得C语言的字符串简单且灵活,但也容易因为操作不当而导致错误(如数组越界、未正确添加空字符等)。
1. 字符串的定义
- 字符数组方式:
定义字符串时,可以使用字符数组。
必须确保数组的最后一个元素是\0,否则字符串未正确结束。
char str[10] = "hello"; // 自动加上 \0
- 指针方式:
使用字符指针指向一个以\0结束的字符序列。
例如:
char *str = "hello";
注意:使用这种方式定义的字符串是只读的,修改会引发未定义行为。
2. 字符串的输入与输出
- 输入字符串:
可以使用 scanf,但它在读取字符串时以空格作为分隔符,仅能读取单词。
char name[50];
scanf("%s", name);
要读取带空格的整行字符串,可使用 gets(已废弃)或 fgets。
fgets(name, sizeof(name), stdin);
- 输出字符串:
使用 printf 输出字符串:
printf("%s", name);
3. 字符串的基本操作
C语言没有内置的字符串类型,因此需要依赖 <string.h> 提供的函数来操作字符串:
- 求字符串长度:strlen
计算字符串长度(不包含\0)。
#include <string.h>
int len = strlen("hello"); // len = 5
- 字符串复制:strcpy 和 strncpy
strcpy 将一个字符串复制到另一个字符串。
strncpy 可以指定最大复制长度。
char str1[10], str2[] = "world";
strcpy(str1, str2); // str1 = "world"
- 字符串连接:strcat 和 strncat
strcat 将一个字符串附加到另一个字符串末尾。
strncat 限制附加长度。
char str1[20] = "hello ", str2[] = "world";
strcat(str1, str2); // str1 = "hello world"
- 字符串比较:strcmp 和 strncmp
比较两个字符串是否相等。
返回值:0 表示相等,正值或负值表示大小关系。
int result = strcmp("abc", "abd"); // result < 0
- 字符串查找:strchr 和 strstr
查找字符或子字符串在字符串中的首次出现。
char *pos = strchr("hello", 'e'); // pos 指向 'e'
char *substr = strstr("hello world", "world"); // substr 指向 "world"
4. 常见字符串操作中的问题
- 数组越界:
未预留足够空间存储字符串和\0。
如:
char str[5];
strcpy(str, "hello"); // 错误,str 空间不足
- 忘记加\0:
手动操作字符串时,必须在末尾加上\0,否则字符串未定义。
- 指针操作的风险:
如果用字符指针直接指向字符串常量,修改内容会导致错误。
char *str = "hello";
str[0] = 'H'; // 错误:只读字符串
5. 案例:实现字符串反转功能
以下展示一个完整的字符串反转程序:
#include <stdio.h>
#include <string.h>
#include <windows.h>
// 函数声明
void reverseString(char str[]);
int main() {
char str[100];
SetConsoleOutputCP(65001);
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
// 移除 fgets 捕获的换行符
size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
printf("原字符串:%s\n", str);
reverseString(str);
printf("反转后字符串:%s\n", str);
return 0;
}
// 字符串反转函数
void reverseString(char str[]) {
int i, j;
char temp;
int len = strlen(str);
for (i = 0, j = len - 1; i < j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
- 运行示例
6. 总结
- C语言字符串本质是字符数组,需特别注意内存管理。
- 操作字符串时尽量使用库函数,如strcpy、strlen等,避免手动管理带来的错误。
- 字符串处理是C语言中重要的技能,广泛应用于文件处理、数据解析、网络通信等领域。
- 通过掌握字符串基础和库函数,可以轻松实现复杂的字符串操作,提高开发效率。