练习1.16
编程:从文本中一行一行的字符,读完之后,将最长的行打印出来。要求能打印任意长度的行。
注:将最长行保存案后打印任意长度的输入行是不可能的!!!因为在读取完整个文本之后,最长的输入行是保存在一个字符数组中的,而字符数组是有长度的,他不可能无限长,这里作者的意思我不明白。
这个程序一行最多能够读取1023个字符,如果超过1023还没有遇到回车('\n')或者字符串结束符('\0'),那么下面的字符将作为下一行。
如果真正要做到输出最长的一行,也不是不可以做到!!!我可以在程序返回的时候,获得一个那个最长行在文件的位置信息,然后打印的时候,重新去访问文件。。到我觉得这不是作者的意思。。参考答案上也不是这样做的。。。并且这样做仅仅对于文本文件的输入有作用,对于实时的交互(例如从控制终端输入)就不能在输入完成之后在获得输入文件数据的相关信息了。。
程序流程图如下:
getline函数的流程图如下:
整个程序的代码如下:
#include <stdio.h> #include <string.h> #define MAXLINE 1024 size_t getline(FILE *fin, char *line, size_t maxlen); void displayLine(FILE *fout, char *line); int main(int argc, char *argv[]) { char currLine[MAXLINE] = ""; char maxLine[MAXLINE] = ""; size_t currLen = 0; size_t maxLen = 0; FILE *fp = fopen("main.c", "r"); while ((currLen = getline(fp, currLine, MAXLINE)) != EOF) { // printf("%ld\n", currLen); // printf("%s", currLine); // getchar(); if (currLen > maxLen) { maxLen = currLen; strcpy(maxLine, currLine); } } if (maxLen != 0) { displayLine(stdout, maxLine); } return 0; } size_t getline(FILE *fin, char *line, size_t maxlen) { int c = 0; size_t i = 0; while (i < maxlen) { c = fgetc(fin); if (i == 0 && c == EOF) return EOF; switch (c) { case '\n': { line[i] = '\n'; line[i+1] = '\0'; } return i+1; case '\0': // line[i] = '\0'; // break; case EOF: line[i] = '\0'; return i+1; default: line[i++] = c; } } } void displayLine(FILE *fout, char *line) { size_t i = 0; while (line[i] != '\0') { fputc(line[i++], fout); } }
汗啊。。这么久才写这么几个程序。。。还是这样的程序。。。