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语言中重要的技能,广泛应用于文件处理、数据解析、网络通信等领域。
  • 通过掌握字符串基础和库函数,可以轻松实现复杂的字符串操作,提高开发效率。
相关推荐
isyangli_blog7 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008117 小时前
FastAPI APIRouter
开发语言·python
Benszen7 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆7 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木7 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充7 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~7 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6168 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草8 小时前
反射、Tomcat执行
java·开发语言
雪的季节9 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt