zoukankan      html  css  js  c++  java
  • 练习1.16

    编程:从文本中一行一行的字符,读完之后,将最长的行打印出来。要求能打印任意长度的行。

    注:将最长行保存案后打印任意长度的输入行是不可能的!!!因为在读取完整个文本之后,最长的输入行是保存在一个字符数组中的,而字符数组是有长度的,他不可能无限长,这里作者的意思我不明白。

    这个程序一行最多能够读取1023个字符,如果超过1023还没有遇到回车(' ')或者字符串结束符(''),那么下面的字符将作为下一行。

    如果真正要做到输出最长的一行,也不是不可以做到!!!我可以在程序返回的时候,获得一个那个最长行在文件的位置信息,然后打印的时候,重新去访问文件。。到我觉得这不是作者的意思。。参考答案上也不是这样做的。。。并且这样做仅仅对于文本文件的输入有作用,对于实时的交互(例如从控制终端输入)就不能在输入完成之后在获得输入文件数据的相关信息了。。

    程序流程图如下:

    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
    ", 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 '
    ':
                    {
                        line[i] = '
    ';
                        line[i+1] = '';
                    }
                    return i+1;
                case '':
                  //      line[i] = '';
                  //      break;
                case EOF:
                        line[i] = '';
                         return i+1;
                default:
                    line[i++] = c;
            }
        }
    }
    
    void displayLine(FILE *fout, char *line)
    {
        size_t i = 0;
        while (line[i] != '') {
            fputc(line[i++], fout);
        }
    }

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

  • 相关阅读:
    iOS Xcode制作模板类
    图片变形的抗锯齿处理方法
    iOS 9 分屏多任务:入门(中文版)
    iOS应用国际化教程(2014版)
    GitHub Top 100 简介
    iOS @synthesize var = _var 变量前置下划线解释
    @synthesize obj=_obj的意义详解 @property和@synthesize
    git 教程(14)--解决冲突
    git 教程(13)--创建与合并分支
    C++基础知识(3)---new 和 delete
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3146788.html
Copyright © 2011-2022 走看看