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.hqwc.cn/news/221300.html

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

相关文章

【赠书第8期】工程效能十日谈

文章目录 前言 1 工程效能十日谈 1.1 制定清晰的目标和计划 1.2 引入先进的技术和工具 1.3 建立有效的沟通机制 1.4 灵活应对变化 1.5 确保资源充足 1.6 进行有效的风险管理 1.7 进行持续的监控和评估 1.8 优化团队合作 1.9 注重质量管理 1.10 进行项目总结和反思 …

NX二次开发UF_CURVE_ask_offset_parms 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_offset_parms Defined in: uf_curve.h int UF_CURVE_ask_offset_parms(tag_t offset_curve_object, UF_CURVE_offset_data_p_t offset_data_pointer ) overview 概述 …

[pyqt5]pyqt5设置窗口背景图片后上面所有图片都会变成和背景图片一样

pyqt5的控件所有都是集成widget&#xff0c;窗体设置背景图片后控件背景也会跟着改变&#xff0c;此时有2个办法。第一个办法显然我们可以换成其他方式设置窗口背景图片&#xff0c;而不是使用styleSheet样式表&#xff0c;网上有很多其他方法。还有个办法就是仍然用styleSheet…

jenkins流水线(pipline)实例

1、pipline 语法介绍 声明式的pipeline语法格式 1. 所有的声明都必须包含在pipeline{}中 2. 块只能有节段&#xff0c;指令&#xff0c;步骤或者赋值语句组成 3. 阶段&#xff1a;agent&#xff0c;stages&#xff0c;post&#xff0c;steps 4. 指令&#xff1a;environment&a…

RedLock底层源码分析

RedLock底层源码分析 一、Redlock红锁算法 https://redis.io/docs/manual/patterns/distributed-locks/官网说明 1、为什么要学习这个&#xff1f;怎么产生的&#xff1f; ​ 一个很直接的问题&#xff0c;当我使用redis锁的那台机器挂了&#xff0c;出现了单点故障了&#…

transformers pipeline出现ConnectionResetError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

案例030:基于微信小程序的英语学习交流平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

PTA-7-53 身份证排序

题目&#xff1a; 输入n&#xff0c;然后连续输入n个身份证号。 将每个身份证的年月日抽取出来&#xff0c;按年-月-日格式组装&#xff0c;然后对组装后的年-月-日升序输出。 根据题目要求&#xff0c;代码实现如下&#xff1a; import java.util.Scanner; import java.uti…

MUI框架从新手入门【webapp开发教程】

文章目录 MUI -最接近原生APP体验的高性能前端框架APP开发3.25 开发记录miu框架介绍头部/搜索框&#xff1a;身体>轮播图轮播图设置数据自动跳转&#xff1a;九宫格图片九宫格图文列表底部选项卡按钮选择器手机模拟器 心得与总结&#xff1a;MUI框架在移动应用开发中的应用M…

设计模式精讲:掌握单例模式的实现与优化

掌握单例模式的实现与优化 一、引言&#xff1a;如何学习设计模式&#xff1f;二、前置知识&#xff1a;对象的创建的销毁2.1、拷贝构造2.2、拷贝赋值构造2.3、移动构造2.4、移动赋值构造 三、单例模式的定义四、单例模式的实现与优化4.1、版本一4.2、版本二4.3、版本三4.4、版…

手把手教会你--github的学习--持续更新

有什么问题&#xff0c;请尽情问博主&#xff0c;QQ群796141573 前言1.1 使用过程(1) 进入某个项目(2) 点击某个文件(3) 在源码区域下面(4) 源码区的头顶上 1.2 作者的其他项目1.3 搜索1.4 复制别人的代码(即项目)到自己的空间内1.5 上传自己的Bugs(bushi1.6 在线修改文件1.7 评…

【数据中台】开源项目(2)-Moonbox计算服务平台

Moonbox是一个DVtaaS&#xff08;Data Virtualization as a Service&#xff09;平台解决方案。 Moonbox基于数据虚拟化设计思想&#xff0c;致力于提供批量计算服务解决方案。Moonbox负责屏蔽底层数据源的物理和使用细节&#xff0c;为用户带来虚拟数据库般使用体验&#xff0…