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

C PRIMER PLUS——第8节:字符串和字符串函数

目录

1. 字符串的定义与表示

2. 获取字符串的两种方式

 3.字符串数组

4. 字符串输入函数 

4.1 gets()(不推荐使用,有缓冲区溢出风险)

4.2 fgets()(推荐使用)

4.3 scanf()

4.4 gets_s()(C11 标准,MSVC 支持)

4.5 s_gets()(自定义安全函数)

5. 字符串输出函数 

5.1 puts()

5.2 fputs()

5.3 printf()

6.  函数

6.1 strlen()

6.2 strcat()

6.3 strcpy()

6.4 strcmp()

6.5 strlwr() 和 strupr()(非标准,部分编译器支持)

7.  字符处理函数

7.1 字符分类函数

7.2 字符转换函数 

7.3综合示例:统计字符串中的字母和数字


1. 字符串的定义与表示

在 C 语言中,字符串是由字符数组表示的,以 ** 空字符\0** 结尾。例如:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式初始化

char message[] = "Hello"; // 自动添加'\0',等价于上面的写法


2. 获取字符串的两种方式

  • 字符数组:预分配内存,长度固定

char name[20]; // 定义长度为20的字符数组

  • 字符指针:指向字符串常量(存储在只读内存区) 
    • 只读常量区特点:①内容不可以修改。②里面定义的字符串是可以复用的。

char *greeting = "Hello"; // 指向字符串常量的指针


 3.字符串数组

  • 二维字符数组:存储多个字符串
char fruits[3][10] = {"Apple","Banana","Cherry"
}; // 3个字符串,每个最大长度9(留一个位置给'\0')
  • 指针数组:每个元素是一个字符串指针 
char *colors[] = {"Red","Green","Blue"
}; // 更灵活,可指向不同长度的字符串

4. 字符串输入函数 

4.1 gets()不推荐使用,有缓冲区溢出风险)

  • 作用:从标准输入读取一行字符串(直到换行符\n
  • 缺点:不检查输入长度,可能导致缓冲区溢出
  • 示例

char str[10];

gets(str); // 输入超过9个字符会溢出

4.2 fgets()推荐使用

  • 作用:从文件或标准输入读取字符串,指定最大长度
  • 原型fgets(str, size, stdin)
  • 特点:会读取换行符\n,需手动处理
  • 示例

char str[10];

fgets(str, 10, stdin); // 最多读9个字符,留一个给'\0'

4.3 scanf()

  • 作用:格式化输入,遇空格或换行符停止
  • 示例

char name[20];

scanf("%s", name); // 输入"John Doe"时,只读取"John"

4.4 gets_s()(C11 标准,MSVC 支持)

  • 作用:安全版本的gets(),需指定缓冲区大小
  • 示例

char str[10];

gets_s(str, 10); // 安全读取,超出长度会截断

4.5 s_gets()(自定义安全函数)

  • 作用:手动实现安全读取,处理换行符
char *s_gets(char *st, int n) {char *ret_val;ret_val = fgets(st, n, stdin);if (ret_val) {char *find = strchr(st, '\n'); // 查找换行符if (find) *find = '\0'; // 替换为'\0'else while (getchar() != '\n') continue; // 清除多余输入}return ret_val;
}

5. 字符串输出函数 

5.1 puts()

  • 作用:输出字符串并自动添加换行符
  • 示例

char str[] = "Hello";

puts(str); // 输出"Hello"后换行

5.2 fputs()

  • 作用:输出字符串到文件或标准输出,不添加换行符
  • 示例

char str[] = "Hello";

fputs(str, stdout); // 输出"Hello"

5.3 printf()

  • 作用:格式化输出字符串
  • 示例

char name[] = "Alice";

printf("Hello, %s!\n", name); // 输出"Hello, Alice!"


6. <string.h> 函数

6.1 strlen()

  • 作用:计算字符串长度(不包含\0
  • 示例

char str[] = "Hello";

int len = strlen(str); // len = 5

6.2 strcat()

  • 作用:拼接两个字符串
  • 原型strcat(dest, src)
  • 示例

char dest[20] = "Hello, ";

char src[] = "World!";

strcat(dest, src); // dest = "Hello, World!"

6.3 strcpy()

  • 作用:复制字符串
  • 原型strcpy(dest, src)
  • 示例

char src[] = "Hello";

char dest[10];

strcpy(dest, src); // dest = "Hello"

6.4 strcmp()

  • 作用:比较两个字符串
  • 返回值
    • 0:相等
    • 负数:str1 < str2
    • 正数:str1 > str2
  • 示例

int result = strcmp("apple", "banana"); // result < 0

6.5 strlwr() 和 strupr()(非标准,部分编译器支持)

  • 作用:转换字符串大小写
  • 示例

char str1[] = "Hello";

char str2[] = "Hello";

_strlwr(str1); // str1 = "hello" (如果编译器支持)

_strupr(str2); // str2 = "HELLO" (如果编译器支持)


7. <ctype.h> 字符处理函数

7.1 字符分类函数

7.2 字符转换函数 

7.3综合示例:统计字符串中的字母和数字

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {char str[100];int letters = 0, digits = 0, others = 0;printf("Enter a string: ");fgets(str, 100, stdin);// 处理fgets可能读取的换行符str[strcspn(str, "\n")] = 0;for (int i = 0; str[i] != '\0'; i++) {if (isalpha(str[i]))letters++;else if (isdigit(str[i]))digits++;elseothers++;}printf("Letters: %d\n", letters);//识别字母数量printf("Digits: %d\n", digits);//识别数字数量printf("Other characters: %d\n", others);//识别空格或符号数量return 0;
}

    http://www.xdnf.cn/news/382285.html

    相关文章:

  • 初等数论--欧拉定理及证明
  • 计算最短路径的数量模板(最短路)
  • 【智能指针】
  • 前端项目中单元测试与集成测试的管理实践
  • 基于51单片机的模拟洗衣机控制面板proteus仿真
  • JavaScript篇:async/await 错误处理指南:优雅捕获异常,告别失控的 Promise!
  • Java并发编程,从线程安全到死锁避免的实战解析
  • Java代码日志嵌入打包时间
  • 【排错】dify1.3.1插件市场安装报错问题
  • 《从零开始:构建你的第一个区块链应用》
  • 什么是文件描述符(File Descriptor,FD)
  • 45.中医知识问答管理员端对话信息查看功能bug修复(1)
  • 在 Vue 3 中实现刮刮乐抽奖
  • 进阶 DFS 学习笔记
  • 地学领域中常见的数据类型总结
  • 游戏服务器出现卡顿该怎么处理?
  • 学习黑客5 分钟深入浅出理解Linux Logs [特殊字符]
  • 【C++】string类
  • leetcode0829. 连续整数求和-hard
  • CountDownLatch 并发编程中的同步利器
  • JavaScript 内存管理与垃圾回收机制
  • DB4S:一个开源跨平台的SQLite数据库管理工具
  • BufferAttribute
  • vs查看dmp崩溃信息
  • Python递归函数
  • 【TypeScript】类型别名(Type Alias)与接口类型(Interface)
  • Redisson 看门狗机制
  • Unity3D仿星露谷物语开发41之创建池管理器
  • 记录一次window2012r2安装配置oracle11g的过程-出现的错误以及解决方法
  • 谷歌学术链接