练习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);
    }
}

 

汗啊。。这么久才写这么几个程序。。。还是这样的程序。。。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值