当前位置: 首页 > 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;
}

    相关文章:

  • 力扣刷题(第二十二天)
  • 小刚说C语言刷题—1078求恰好使s=1+1/2+1/3+…+1/n的值大于X时n的值
  • 【MCAL】TC397+EB-tresos之I2c配置实战(同步、异步)
  • 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘
  • 记录踩过的坑-金蝶云苍穹平台-轻分析和轻报表(慢慢更新)
  • TCP IP
  • 图(邻接矩阵和邻接表)
  • 质心均匀体(引力屏蔽技术)
  • [ctfshow web入门] web68
  • Android 使用Paging3 实现列表分页加载、下拉刷新、错误重试、筛选功能
  • Java 泛型(Generic)
  • 基于NI-PXI的HIL系统开发
  • matlab介绍while函数
  • 从爬虫到网络---<基石9> 在VPS上没搞好Docker项目,把他卸载干净
  • CSS弹性布局
  • 最大公约数gcd和最小公倍数lcm
  • Yocto是如何使用$D目录来构建文件系统的?
  • 2025年货运从业资格考试题库及答案
  • comfyu BiRefNet-General模型下载及存放地方
  • JDK10新特性
  • 金地集团:今年前4个月实现销售额109.3亿元,同比下降52.44%
  • 援藏博士张兴堂已任西藏农牧学院党委书记、副校长
  • 中俄元首今年首次面对面会谈,达成哪些新的重要共识?
  • 马上评|比余华与史铁生的友情更动人的是什么
  • 对话|蓬皮杜策展人布莱昂:抽象风景中的中国审美
  • AI聊天机器人涉多起骚扰行为,专家呼吁加强伦理设计与监管