C语言:字符串

在C语言中,字符串是一个字符数组,以 空字符(\0) 结尾表示字符串的结束。这种实现方式使得C语言的字符串简单且灵活,但也容易因为操作不当而导致错误(如数组越界、未正确添加空字符等)。

1. 字符串的定义

  • 字符数组方式

定义字符串时,可以使用字符数组。

必须确保数组的最后一个元素是\0,否则字符串未正确结束。

c 复制代码
char str[10] = "hello";  // 自动加上 \0
  • 指针方式

使用字符指针指向一个以\0结束的字符序列。

例如:

c 复制代码
char *str = "hello";

注意:使用这种方式定义的字符串是只读的,修改会引发未定义行为。

2. 字符串的输入与输出

  • 输入字符串

可以使用 scanf,但它在读取字符串时以空格作为分隔符,仅能读取单词。

c 复制代码
char name[50];
scanf("%s", name);

要读取带空格的整行字符串,可使用 gets(已废弃)或 fgets。

c 复制代码
fgets(name, sizeof(name), stdin);
  • 输出字符串

使用 printf 输出字符串:

c 复制代码
printf("%s", name);

3. 字符串的基本操作

C语言没有内置的字符串类型,因此需要依赖 <string.h> 提供的函数来操作字符串:

  • 求字符串长度:strlen

计算字符串长度(不包含\0)。

c 复制代码
#include <string.h>
int len = strlen("hello"); // len = 5
  • 字符串复制:strcpy 和 strncpy

strcpy 将一个字符串复制到另一个字符串。

strncpy 可以指定最大复制长度。

c 复制代码
char str1[10], str2[] = "world";
strcpy(str1, str2); // str1 = "world"
  • 字符串连接:strcat 和 strncat

strcat 将一个字符串附加到另一个字符串末尾。

strncat 限制附加长度。

c 复制代码
char str1[20] = "hello ", str2[] = "world";
strcat(str1, str2); // str1 = "hello world"
  • 字符串比较:strcmp 和 strncmp

比较两个字符串是否相等。

返回值:0 表示相等,正值或负值表示大小关系。

c 复制代码
int result = strcmp("abc", "abd"); // result < 0
  • 字符串查找:strchr 和 strstr

查找字符或子字符串在字符串中的首次出现。

c 复制代码
char *pos = strchr("hello", 'e'); // pos 指向 'e'
char *substr = strstr("hello world", "world"); // substr 指向 "world"

4. 常见字符串操作中的问题

  • 数组越界

未预留足够空间存储字符串和\0。

如:

c 复制代码
char str[5];
strcpy(str, "hello"); // 错误,str 空间不足
  • 忘记加\0

手动操作字符串时,必须在末尾加上\0,否则字符串未定义。

  • 指针操作的风险

如果用字符指针直接指向字符串常量,修改内容会导致错误。

c 复制代码
char *str = "hello";
str[0] = 'H'; // 错误:只读字符串

5. 案例:实现字符串反转功能

以下展示一个完整的字符串反转程序:

c 复制代码
#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语言中重要的技能,广泛应用于文件处理、数据解析、网络通信等领域。
  • 通过掌握字符串基础和库函数,可以轻松实现复杂的字符串操作,提高开发效率。
相关推荐
ocean21034 小时前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
白远山5 小时前
健身场馆无人自动化系统实战指南:从架构设计到部署全流程解析
java·开发语言·架构·需求分析
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出独特卡片数字——只出现一次的元素
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
郝学胜-神的一滴5 小时前
C++20模板元编程 02:吃透模板基础核心四大核心知识点
开发语言·数据结构·c++·程序人生·软件工程·visual studio
troy1285 小时前
Visual Studio Code 详细教程:从入门到高效开发
开发语言·python
泡海椒5 小时前
jquick-pdf 超详细入门教程:Java 轻量级 HTML 模板生成 PDF 工具
java·开发语言
八年。。5 小时前
WSL学习(三)——搭建Linux + C++ + SOME/IP 基础开发环境
开发语言·笔记·ubuntu
代码王同学5 小时前
2026.9.15日C++类和对象学习收获笔记
c语言·c++
孙启超5 小时前
【AI开发之Rust】第 6 课:结构体、枚举与方法 —— 开始定义自己的类型
开发语言·人工智能·后端·ai·rust
irislinAmelia5 小时前
Day11文章_多路视频流加权公平调度与令牌桶QoS
c语言·人工智能