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;}
}