1.9 字符数组

1.9 字符数组

  • 一、字符数组概述
  • 二、练习

一、字符数组概述

所谓字符数组,就是char类型的数组,比如 char a[],是C语言中最常用的数组类型,先看一个程序

#include <stdio.h>
#define MAXLINE 1000 //最大行长度限制
int getline(char line[], int maxline); // 读取一行
void copy(char to[], char from[]); // 数组拷贝// 打印所有输入行中长度最长的行
main()
{int len; // 当前行长度int max; // 最大长度char line[MAXLINE]; // 保存当前输入行char longest[MAXLINE]; // 保存最长的行max = 0;while ((len = getline(line, MAXLINE)) > 0) {if (len > max) {max = len;copy(longest, line);}}if (max > 0)printf("%s", longest);return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i;for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)s[i] = c;if (c == '\n') {s[i] = c;++i;}s[i] = '\0';return i;
}// 返回值类型为void,显式说明该函数不返回任何值
void copy(char to[], char from[]) {int i;i = 0;while ((to[i] = from[i]) != '\0')++i;
}

以上的程序功能就是,从输入的多行文本中,找出最长的一行文本,进行打印。值的说明的是:

  • getline函数把字符 ‘\0’ (即空字符,其值为0,可以用 printf(“%d%c%d”, ‘\0’, ‘\0’, ‘\0’); 体会一下) 插入到数组的末尾,以标记字符串的结束。这一约定已被C语言采用:当在C语言程序中出现类似于 “hello\0” 的字符串常量时,它将以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,并以’\0’标志字符串的结束。printf函数的%s规定,对应的参数必须是以这种形式表示的字符串
    在这里插入图片描述
#include <stdio.h>main()
{printf("%d%c%d\n", '\0', '\0', '\0');char chars[3];chars[0] = '0';chars[1] = '1';//chars[2] = '2';chars[2] = '\0';printf("%s", chars);return 0;
}

二、练习

  1. 修改打印最长文本行的程序的主程序main, 使之可以打印任意长度的输入行,并尽可能多的打印文本。

为了便于测试,把MAXLINE 改成10
在这里插入图片描述
根据上述分析,显然有两个问题
① 输出的长度最大是9
② 打印的数组出现未知值
这就是这个题目要解决的问题:打印任意长度,打印正确的数组

修改点(其他与原程序相同):
main函数中,printf("%d, %s", len, line);
getline函数,重写
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}
  1. 编写一个程序,打印长度大于80个字符的所有输入行。
#include <stdio.h>
#define MAXLINE 1000 //最大行长度限制
#define MAXCHAR 80 // 行字符数
int getline(char line[], int maxline); // 读取一行// 编写一个程序,打印长度大于80个字符的所有输入行。
main()
{int len; // 当前行长度char line[MAXLINE]; // 保存当前输入行while ((len = getline(line, MAXLINE)) > 0) {if (len > MAXCHAR) {printf("%d, %s", len, line);}}return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}
  1. 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
#include <stdio.h>
#define MAXLINE 10 //最大行长度限制
int getline(char line[], int maxline); // 读取一行
int remove(char line[]); // 删除行尾空格和制表符、删除完全是空格的行,并返回其他字符占有数组的长度// 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
main()
{int len; // 当前行长度char line[MAXLINE]; // 保存当前输入行while ((len = getline(line, MAXLINE)) > 0) {if(remove(line) > 0)printf("%d, %s", len, line);}return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}// 删除行尾空格和制表符、删除完全是空格的行,并返回其他字符占有数组的长度
int remove(char s[]) {int i;i = 0;while (s[i] != '\n')++i;--i;// 从\n前的一个字符开始,往前退,// 如果是空格或制表符,继续往前退,// 如果不是空格和制表符,或者字符串已经遍历完(i=0),退出循环while (i>0 && (s[i] == ' ' || s[i] == '\t'))--i;return i;
}
  1. 编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
#include <stdio.h>
#define MAXLINE 10 //最大行长度限制
int getline(char line[], int maxline); // 读取一行
void reverse(char line[]); // 反转字符串
// 编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
main()
{int len; // 当前行长度char line[MAXLINE]; // 保存当前输入行while ((len = getline(line, MAXLINE)) > 0) {reverse(line);printf("%d, %s", len, line);}return 0;
}// 读取一行数据到数组s中,并返回该行的长度
int getline(char s[], int lim) {int c, i, j;j = 0; /* s数组的下标,0~lim-1,可保证数组不越界 */for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)if (j < lim - 2) {s[j] = c;++j;}if (c == '\n') {s[j] = c;++j;++i;}s[j] = '\0';return i; // i表示实际输入的字符数
}void reverse(char s[]) {int i, j; // 两个游标,i从数组的后面往前移,j从前往后移char temp; // 临时变量,用于交换两个数组元素i = 0;while (s[i] != '\0')++i;--i;if (s[i] == '\n')--i;j = 0;while (j < i) {temp = s[j];s[j] = s[i];s[i] = temp;--i;++j;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle构建项目速度优化及排查方式

文章目录 一、前言二、Android项目优化1、相关配置2、构建速度分析 三、Gradle项目通用优化1、分析构建耗时2、使用配置进行优化3、优化依赖解析a. 避免不必要和未使用的依赖项b. 优化存储库顺序 c. 最小化动态和快照版本d. 通过构建扫描查找动态和变化的版本e. 通过构建扫描可…

⑤【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

[C/C++]数据结构 堆的详解

一:概念 堆通常是一个可以被看做一棵完全二叉树的数组对象,它是一颗完全二叉树,堆存储的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并且需要满足每个父亲结点总小于其子节点(或者每个父亲结点总大于其子节点) 堆可以分为两种: 小堆: 任意一个父亲节点都小于其子…

AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

Rust逆向学习 (6)

文章目录 Reverse for Stringpush_str 与 format!bytes方法chars方法 总结 Reverse for String 上一篇文章简单分析了Vec变长数组的结构&#xff0c;今天来介绍String。实际上Rust的字符串类型对于我们并不陌生&#xff0c;在前面几篇文章的几乎任何一个示例中都可以找到它们。…

项目开发的大致流程

一、需求分析 功能界面… 二、前后端沟通 传递参数类型接口请求方式&#xff08;GET POST PUT DELETE.&#xff09;传参的方式… 三、后端编写接口文档&#xff08;包括但不限于以下几个方面&#xff09; 接口名称是否清晰 接口地址是否完整 接口请求方式是否正确 请求参…

HarmonyOS应用开发者基础认证【满分答案】

系列文章 HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者基础认证【满分答案】 HarmonyOS云开发基础认证【最新题库 满分答案】 目录 系列文章一、判断题二、单选题三、多选题 一、判断题 在Column和Row容器组件中&#xff0c;justifyContent用于设置…

处理数据中的缺失值--删除缺少值的行

两个最主要的处理缺失值的方法是&#xff1a; ❏ 删除缺少值的行&#xff1b; ❏ 填充缺失值&#xff1b; 我们首先将serum_insulin的中的字段值0替换为None&#xff0c;可以看到缺失值的数量为374个&#xff1b; print(pima[serum_insulin].isnull().sum()) pima[serum_insu…

HarmonyOS(七)——@BuilderParam装饰器

前言&#xff1a; 前面我们认识了Builder装饰器&#xff1a;自定义构建函数&#xff0c;今天我们继续认识下一个装饰器——BuilderParam装饰器。 当开发者创建了自定义组件&#xff0c;并想对该组件添加特定功能时&#xff0c;例如在自定义组件中添加一个点击跳转操作。若直接…

常见树种(贵州省):022绣线菊、月月青、金合欢、胡枝子、白刺花

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、绣线菊…

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

文章目录 专栏导读一、地图应用场景二、参数说明1. 导包2. add函数 三、地图绘制实战1. 省市地图2. 中国地图3. 中国地图&#xff08;带城市&#xff09;4. 中国地图&#xff08;分段型&#xff09;5. 中国地图&#xff08;连续型&#xff09;6. 世界地图7. 行程轨迹地图8. 人口…

WebUI自动化学习(Selenium+Python+Pytest框架)001

开启另一篇学习之路_WebUI自动化 先来一波基础概念 1.自动化适合什么类型的项目: 重复性高,迭代频率高的回归测试。数据量大、手工难以实现的压力测试&#xff0c;手工执行效率低的兼容测试 2.自动化的优点: 高效率、可重复、减少人为错误、克服手工测试的局限性 3.自动化…

光线追踪-Peter Shirley的RayTracingInOneWeekend系列教程(book1-book3)代码分章节整理

自己码完了一遍了&#xff0c;把代码分章节整理了一下&#xff0c;可以按章节独立编译&#xff0c;运行, 也可以直接下载编译好的release版本直接运行。 项目地址&#xff1a; Github: https://github.com/disini/RayTracingInOneWeekendChaptByChapt ​ ​ ​ ​

17 Go的文件操作

概述 在上一节的内容中&#xff0c;我们介绍了Go的反射&#xff0c;包括&#xff1a;reflect.TypeOf、reflect.ValueOf、reflect.Value等。在本节中&#xff0c;我们将介绍Go的文件操作。在Go语言中&#xff0c;文件是一个抽象的概念&#xff0c;表示的是一段连续的字节序列。文…

iframe实现跨域通信的方法

在前端开发中&#xff0c;我们经常会遇到跨域通信的问题。跨域通信是指在浏览器的同源策略下&#xff0c;不同源之间的通信。本文将介绍如何通过 iframe 实现跨域通信&#xff0c;以及不跨域通信的方法和代码示例。 引言 跨域通信是指在浏览器的同源策略下&#xff0c;不同源之…

Rust语言入门教程(八) - 引用与借用

上一章的内容中我们讨论了Rust的所有权系统&#xff0c;当我们不想移动值的所有权时&#xff0c;我们可以使用引用和借用&#xff0c;而这正是本章想要讨论的问题。 引用&#xff08;References&#xff09; 引用允许你访问或修改数据而无需获取数据的所有权。在 Rust 中&…

阿里云MQTT: 子设备上线流程

0. 背景 阿里云网关子设备上平台的资料很少。有些厂家直接配置每个子设备的DeviceSecret到网关里&#xff0c;显然太麻烦了&#xff01;我经过阅读阿里文档&#xff0c;发现有些简化的方法&#xff0c;更便于客户使用&#xff0c;因此分享给大家。 1. 主要信息片段 子设备 $…

屏蔽WordPress评论中长URL地址方法

由于WordPress是比较常见的CMS程序之一&#xff0c;所以很多网络营销推广也会基于WP去群发外链和广告信息。这里&#xff0c;我们可以通过屏蔽特定关键字、屏蔽特定字符的方式&#xff0c;或者是屏蔽评论内容的长短来限制评论。还有一个我们可以通过评论内容的URL地址的长度来屏…

基于springboot+mysql实现的小区物业管理系统

基于springbootmysql实现的小区物业管理系统,演示地址:登录 演示账号&#xff1a;用户名:744621980qq.com 密码:123456,主要包含房屋管理(楼栋管理&#xff0c;单元管理&#xff0c;房屋管理)&#xff0c;车位管理&#xff0c;缴费管理&#xff0c;社区服务( 公告管理&#xf…

Linux socket编程(6):IO复用之select原理及例子

文章目录 1 五种I/O模型1.1 阻塞I/O模型1.2 非阻塞I/O模型1.3 I/O复用模型1.4 信号驱动I/O模型1.5 异步I/O模型 2 select函数3 select实战&#xff1a;实现多个套接字监听3.1 客户端3.2 服务端3.3 实验结果3.4 完整代码 在之前的网络编程中&#xff0c;我们遇到了一个问题&…