C程序设计语言练习1-16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多的打印文本
教材原题读取一组文本行,并把最长的文本行打印出来,源码及分析请见此处。
分析:
1.边界条件为“当输入单词长度超出最长文本行个数限定”,在getLine()操作时,循环语句 for (i = 0; (c = getchar()) != EOF&& c != " "; i++) 不再利用i<MAXNUM-1检查字符是否超出数组边界,这里取i<MAXNUM-1的目的是,字符串数组最后一位s[MAXNUM-1]要存储空字符‘ ’作为文本行结束符,为后续copy(char[] to,char[] from)提供终止条件。现在,我们排除i<MAXNUM-1对单词个数临界值的检查,则此for循环可以返回任意长度的字符串个数。 2.教材中判定条件i<MAXNUM-1 改为i<MAXNUM-2,因为i<MAXNUM-1判断无论是否到达换行符" ",数组满则停止读字符,最后一位s[MAXNUM-1]=‘ ’,标记字符串结束。例如教材中设MAXNUM=5 ,可输入字符个数为4,最后一位放‘ ’。所以当输入123 ,则返回长度为4,line[]输出为123 ;当输入为1234 ,则返回长度为5,line[]输出为1234 。习题1-16将判断条件改成i<MAXNUM-2的目的是为了当存在越界单词时,保证数组后两位存入" "," "。则以MAXNUM=5 为例,当当输入123 ,则返回长度为4,line[]输出为123 ;当输入为1234 ,则返回长度为5line[]输出为123 。//修改打印最长问本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多的打印文本 #include "stdio.h" #define MAXLINE 5//以5作为测试值,正常请修改为1000 int getLine(char line[], int maxline); void copy(char to[], char from[]); int main() { int max = 0; int len = 0; char line[MAXLINE]; char longestLine[MAXLINE]; for (int i = 0; i < MAXLINE; i++) { line[i] = 0; longestLine[i] = 0; } while ((len = getLine(line, MAXLINE)) > 0) {//直到读取EOF,getLine()返回长度为0时,停止读取 printf("%d, %s", len, line); if (len > max) { max = len; copy(longestLine, line); } if (max > 0) { printf("the longestLine = %s", longestLine); } } return 0; } int getLine(char line[], int maxline) { int c, i, j; c = j = 0; for (i = 0; (c = getchar()) != EOF&& c != " "; i++) { if (i < maxline - 2) { line[j] = c; j++; } } if (c == " ") { line[j] = " "; j++; i++; } line[j] = " "; return i; } void copy(char to[], char from[]) { int i = 0; while ((to[i] = from[i]) != " ") { i++; } }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: MVC前后台验证方法
- 下一篇: crontab定时任务脚本不执行,日志无执行记录