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

C语言(八)

一、字符型数组与字符串的存储

1. 三大特性

  • 连续性
    字符数组在内存中连续存储,字符依次排列,无空隙。

    举例:char s[5] = "abcd"; 在内存中依次存放 'a''b''c''d'\0,地址是连续分配的。

  • 有序性

  • 字符型数组中各字符存储顺序固定,字符的位置决定其意义,不能随意打乱。

  • 单一性
    字符型数组的每个元素都是同一种数据类型,即单个 char 字符,占用1个字节。整个数组只存放字符类型,不会掺杂其他类型数据。

2. 字符数组定义方式

char 数组名[元素个数];

示例:

char s[100];

说明:方括号 [] 是类型说明符的一部分,数组容量应满足字符串加结束符 \0 的需求。

3. 初始化方式

char s[100] = "Hello"; // 自动添加 '\0' char s[20] = {'a', 'b'}; // 其余自动补 \0

  • 注意事项

    • 使用双引号时可省略 {}

    • 空字符串 "" 表示仅含一个 \0,占 1 字节。

    • 字符串以 \0 结尾,必须为其留出空间。

    • 字符数组内容可修改,字符串常量不可以。


二、字符串常用函数

1. puts 函数

int puts(const char *s);

  • 功能:输出字符串并自动换行。

  • 示例:

    puts(s); // 等价于 puts(&s[0]);

  • 注意:不能输出单个字符或整型。


2. 判别不同字符串类型

表达式类型占用字节含义说明
0整型常量4 字节值为 0
'0'字符常量1 字节字符 '0',ASCII 为 48
'\0'字符常量1 字节空字符,ASCII 为 0(结束符)
"0"字符串常量2 字节'0' + \0
""字符串常量1 字节仅含 \0


3. gets 函数(不推荐)

char *gets(char *s);

  • 从标准输入读取一行字符串,末尾自动加 \0

  • 问题:不会检查越界,存在安全风险。


4. fgets 函数(推荐)

char *fgets(char *s, int size, FILE *stream);

  • 功能:从文件流 stream 中读取字符串,通常配合 stdin 使用,能够防止越界访问。

  • 示例:

    char s[100]; fgets(s, 100, stdin);

  • 说明:

    • 最多读取 size - 1 个字符,最后一位补 \0

    • 可读取空格,包括换行符 \n

    • 安全性高于 gets

    • 小写转大写:


5. scanf 函数

int scanf(const char *format, ...);

  • 示例:

    scanf("%s", s);

  • 注意

    • 不加 &,因为 s 是数组名,代表地址。

    • 空格、Tab、回车会结束读取,不能读取含空格的字符串。


6. strlen 函数

size_t strlen(const char *s);

  • 功能:返回有效字符数(不含 \0)。

  • 示例:

    char str[] = "abc"; printf("%lu\n", strlen(str)); // 输出3

    printf("%lu\n", sizeof(str)); // 输出4

  • 内存分配:需要 strlen + 1 字节。


7. strcpy 函数

char *strcpy(char *dest, const char *src);

  • 功能:将 src 拷贝到 dest

  • 示例:

    strcpy(s2, s1);

  • 注意dest 空间必须足够大。


8. strcat 函数

char *strcat(char *dest, const char *src);

  • 功能:将 src 追加到 dest 的末尾。

  • 示例:

    strcat(s1, s2);

  • 注意dest 空间需 ≥ strlen(dest) + strlen(src) + 1


9. strcmp 函数

int strcmp(const char *s1, const char *s2);

  • 功能:比较两个字符串。

  • 返回值说明:

    • >0:s1 > s2

    • = 0:s1 == s2

    • < 0:s1 < s2

  • 示例:

    printf("%d\n", strcmp(s1, s2));

  • 比较规则:按 ASCII 逐字符比较,遇不同即判断大小。


三、字符串相关练习题

  1. 求三个字符串中的最大值

  2. 字符串逆序输出

http://www.lryc.cn/news/596471.html

相关文章:

  • es搜索实现既能模糊查询又能分词查询
  • 永不疲倦的守护者:Deepoc具身智能如何重塑安保机器人的“火眼金睛”
  • Kotlin多线程调试
  • 【机器学习】第五章 聚类算法
  • [Semantic Seg][KD]FreeKD: Knowledge Distillation via Semantic Frequency Prompt
  • JS--M端事件
  • Docker容器 介绍
  • Taro 网络 API 详解与实用案例
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十课——车牌识别的FPGA实现(2)实现车牌定位
  • STM32-第十节-DMA直接存储器存取
  • Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章
  • Class10简洁实现
  • IDEA-自动格式化代码
  • 嵌入式 Qt 开发:实现开机 Logo 和无操作自动锁屏
  • C语言面向对象编程
  • linux 环境服务发生文件句柄泄漏导致服务不可用
  • 自定义HAProxy 错误界面
  • 开发板系统烧写
  • 【数学建模|Matlab】Matlab「基础知识」和「基础操作」
  • Vue3 面试题及详细答案120道(31-45 )
  • Arraylist与LinkedList区别
  • MATLAB软件使用频繁,企业如何做到“少买多用”?
  • 论文略读:Towards Safer Large Language Models through Machine Unlearning
  • Go 的第一类对象与闭包
  • (二)Python基础入门-基础语法核心
  • 【Python】常见模块及其用法
  • 解决栅格数据裁剪矢量数据问题两种方法,ArcGIS解决与PYTHON解决
  • Leetcode力扣解题记录--第41题(原地哈希)
  • 力扣-300.最长递增子序列
  • LeetCode 633.平方数之和