当前位置: 首页 > article >正文

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语言中重要的技能,广泛应用于文件处理、数据解析、网络通信等领域。
  • 通过掌握字符串基础和库函数,可以轻松实现复杂的字符串操作,提高开发效率。

http://www.kler.cn/a/407404.html

相关文章:

  • C语言中const char *字符进行切割实现
  • 【线程】Java线程操作
  • 大数据技术之SparkCore
  • SHELL笔记(循环)
  • Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(1)
  • 【C++笔记】list使用详解及模拟实现
  • eduSRC挖洞思路
  • Linux基础05
  • MySQL 三大日志详解
  • Java项目实战II基于微信小程序的新闻资讯平台(开发文档+数据库+源码)
  • 力扣--LCR 123.图书整理I
  • HTML+CSS网页模板,左侧导航,右侧内容,顶部LOGO
  • 【Spring Boot】Spring AOP中的环绕通知
  • 基于深度学习CNN算法的植物/中草药分类识别系统01--带数据集-pyqt5UI界面-全套源码
  • 算法(Algorithm)
  • 想做一个类似于东郊到家这样的预约上门小程序,app也行,这个现在好不好运营?
  • 基于python flask的网页五子棋实现,包括多种语言,可以悔棋、重新开始
  • 【Android】ARouter的使用及源码解析
  • centos和ubuntu有什么区别?
  • ASCB1系列APP操控末端回路智能微断 物联网断路器 远程控制开关 学校、工厂、农场、商业大楼等可用
  • LlamaIndex+本地部署InternLM实践
  • springboot配置https,并使用wss
  • manin动画编程(安装+入门)
  • 从零开始-VitePress 构建个人博客上传GitHub自动构建访问
  • go语言中的指针详解