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

C primer plus (第六版)第十一章 编程练习第1,2,3,4题

感悟:

        C primer plus (第六版)第十一章主要讲的是字符串处理函数,融合之前学习的数组,指针,函数的知识,综合应用于字符串处理函数,如何使用C标准函数并建立自己需要的函数,没学明白,第十一章要学明白还是需要反复看之前的章节的知识点,巩固相关重点知识点,同时需要非常清楚程序在处理字符串中的一系列步骤和细节才可以算是学明白了。看到十一章编程题目只有大致思路,写的程序各种问题跑不通,所以第十一章编程练习答案是直接照搬的网上的编程练习答案,将答案分享出来做个记录后面慢慢研究。

题目:

1.设计并测试⼀个函数,从输⼊中获取n个字符(包括空⽩、制表符、换⾏符),把结果存储在⼀个数组⾥,它的地址被传递作为⼀个参数。

思路:

        需用getchar()函数逐个读入字符并存储在一个数组里面,然后函数返回数组地址,main()函数用puts()进行函数的测试;

题目1程序:

#include <stdio.h>
#define LEN 10
char * getnchar(char * str, int n);         
int main()
{char input[LEN];char * check;check = getnchar(input, LEN-1);if (check == NULL)puts("Wrong input!");elseputs(input);            //回测输入puts("Done.");return 0;
}char * getnchar(char * str, int n)
{int i;int ch;             //用int类型接收getchar()返回值,正确处理EOF(可能为-1),for ( i = 0; i < n; i++){ch = getchar();if (ch != EOF)str[i] = ch;elsebreak;}if (ch == EOF)return NULL;else{str[i] = '\0';return str;}
}// 测试建议
// 输入少于LEN-1个字符(如 5 个),程序应完整输出并显示 "Done."。
// 输入等于LEN-1个字符(如 9 个),程序应完整输出。
// 输入中途按Ctrl+Z(Windows)或Ctrl+D(Linux)触发EOF,程序应输出已输入的部分字符。
// 测试无效参数(如getnchar(NULL, 5)),程序应提示错误。

题目:

2.修改并编程练习1的函数,在n个字符后停⽌,或在读到第1个空⽩、制表符或换⾏符时停⽌,哪个先遇到哪个停⽌。不能只使⽤scanf()。

思路:

        在程序1的基础上进行修改,用for循环限制读取的字符数,同时ch赋值给函数中的数组str[]的时候同时加入题目要求的督导空白,制表符或换行符时停止的限制条件,其他不变。

题目2程序:

#include <stdio.h>
#define LEN 10
char * getnchar(char * str, int n);         
int main()
{char input[LEN];char * check;check = getnchar(input, LEN-1);if (check == NULL)puts("Wrong input!");elseputs(input);            //回测输入puts("Done.");return 0;
}char * getnchar(char * str, int n)
{int i;int ch;             //用int类型接收getchar()返回值,正确处理EOF(可能为-1),for ( i = 0; i < n; i++){ch = getchar();if ((ch != EOF) && (ch != ' ') && (ch != '\t') && (ch != '\n'))str[i] = ch;        //读到EOF,空格,制表符和换行符就不再读下去了elsebreak;}if (ch == EOF)return NULL;else{str[i] = '\0';return str;}
}

题目:

3.设计并测试⼀个函数,从⼀⾏输⼊中把⼀个单词读⼊⼀个数组中,并丢弃输⼊⾏中的其余字符。该函数应该跳过第1个⾮空⽩字符前⾯的所有空⽩。将⼀个单词定义为没有空⽩、制表符或换⾏符的字符序列。

思路:

        首先从题目要求中便可以知道函数首先需要跳过空白,制表或换行符,然后才能确定单词头字母位置,然后和题目1类似,获取n个连续字符(单词为连续字母,字母之间没有空白,制表符或换行符)后,再丢弃掉后续出现空白,制表符或换行符及其后面的所有字符;注意答案中用isspace()函数直接判断字符是否是空;

题目3程序:

#include <stdio.h>
#include <ctype.h>
#define MAXLEN 10
char * getword(char * str);int main()
{char input[MAXLEN];char * check;check = getword(input);if ( check == NULL)puts("Wrong input!");elseputs(check);puts("Done.");return 0;
}char * getword(char * str)
{char * orig = str;int ch;
//跳过字符串开头空白while ( (ch = getchar()) != EOF && isspace(ch))continue;if ( ch == EOF )return NULL;else*str++ = ch;        //首个字符串中的非空字符
//获取单词剩余部分while ( (ch = getchar()) != EOF && isspace(ch))*str++ = ch;*str = '\0';if ( ch == EOF )return NULL;else{while (ch != '\n')ch =  getchar();return orig;}
}

题目:

4.设计并测试⼀个函数,它类似编程练习3的描述,只不过它接受第2个参数指明可读取的最⼤字符数。

思路:

        在题目3的程序的基础上给函数增加参数int n用来指定可以读取的最大字符数,所以需要修改函数中获取单词剩余部分的while循环条件,增加i<n的条件;

题目3程序:

#include <stdio.h>
#include <ctype.h>
#define MAXLEN 10
char * getnword(char * str, int n);     //修改函数名称getnword并增加参数nint main()
{char input[MAXLEN];while (getnword(input, MAXLEN-1) != NULL)   puts(input);puts("Done.");return 0;
}char * getnword(char * str, int n)
{int ch;char * orig = str;int i = 0;//跳过字符串开头空白while ( (ch = getchar()) != EOF && isspace(ch))continue;if ( ch == EOF )return NULL;else*str++ = ch;        //首个字符串中的非空字符
//获取单词剩余部分while ((ch = getchar()) != EOF && !isspace(ch) && i < n)    //增加循环限制条件i<n{*(str + i) = ch;i++;}str[i] = '\0';      //i++增加后的i,str[i]字符串结尾添加'\0'if ( ch == EOF )return NULL;else{while (ch != '\n')ch =  getchar();return orig;}
}

http://www.dtcms.com/a/356976.html

相关文章:

  • typescript postgres@3.x jsonb数据插入绕过类型检测错误问题
  • Linux驱动学习-spi接口
  • 手写一个Spring框架
  • 【树论】树上启发式合并
  • ansible的playbook练习题
  • 短剧小程序系统开发:助力影视行业数字化转型
  • 算法---字符串
  • Speculation Rules API
  • PDF转图片工具实现
  • 天气查询系统
  • 2025_WSL2_Ubuntu20.04_C++20_concept 环境配置
  • el-select多选下拉框出现了e611
  • MySQL 中ORDER BY排序规则
  • 物联网平台中的Swagger(二)安全认证与生产实践
  • Socket编程核心API与结构解析
  • 【C++】掌握类模板:多参数实战技巧
  • 构筑沉浸式3D世界:渲染、资源与体验的协同之道
  • 云计算学习笔记——逻辑卷管理、进程管理、用户提权RAID篇
  • N32G43x Flash 驱动移植与封装实践
  • DBeaver 的 PostgreSQL 驱动包默认存储位置
  • 序列化和反序列的学习
  • 移动社交时代电商流量获取新路径:基于社群与开源AI智能名片链动2+1模式S2B2C商城小程序的探索
  • 【基础-单选】关于Button组件,下面哪个样式是胶囊型按钮
  • 大模型之RAG, 检索增强生成
  • 【若依】RuoYi-Vue-springboot3分离版
  • RS485、RS232、RS422协议
  • 浔川代码编辑器v2.1.0公测版上线时间公告
  • 基于FPGA的DDR3读写实验学习
  • LeetCode算法日记 - Day 26: 归并排序、交易逆序对的总数
  • 河南葱香鸡蛋,嫩滑香浓超棒!