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++;
}
}
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
