从c程序获取输出

时间:2013-11-24 17:53:39

标签: c compilation

我编写了以下程序:

#include <stdio.h>

#define MAXLINE 1000    /* maximum input line length */


int getline(char line[], int maxline);

void copy(char to[], char from[]);



/* print the longest input line */
main()

{

    int len;               /* current line length */

    int max;               /* maximum length seen so far */

    char line[MAXLINE];         /* current input line */

    char longest[MAXLINE];      /* longest line saved here */

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) /* there was a line */
        printf("%s", longest);
    return 0;
}

/* getline: read a line into s, return length */
int getline(char s[],int lim)
{
    int c, i;

    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

我试图在bash shell中运行它:

gcc -o longest-line longest-line.c
./longest-line

基本上它变成了一个运行过程(显示在ps aux的结果中),光标只是闪烁。在代码中,当程序运行并调用getline函数时,它会进行1000次迭代,并且每次调用getchar以从终端获取输入,以便在计数器不是文件结尾或换行符时递增计数器。但是,立即终端没有输入,当我开始添加输入并按回车键时:

$ ./longest-line
Hello World
Hello Again

什么都没发生。它应该打印最长的一行。

2 个答案:

答案 0 :(得分:1)

问题在于,如果按键盘上的'\ n'getline,由于此声明,将始终返回1

if (c == '\n') {
    s[i] = c;
    ++i;
}

并且行while ((len = getline(line, MAXLINE)) > 0)将始终为真。

但是如果您使用文件作为标准输入,它将因EOF而正常工作。

如果您想通过键盘输入工作,请按Ctrl-D或Ctrl-Z来模拟EOF。

答案 1 :(得分:0)

所以,在我的编译器上,我不得不解决一些小问题。

  • 通常,main应写为int main() { ... }int main(int argc, char **argv) { ... }
  • getline()与来自#include <stdio.h>的内置函数冲突,因此我只是将您的名称重命名为getline_custom,并重命名了所有使用点。

话虽如此,通过这些小修补程序(编译器可能不需要),您的程序正确

我相信你的困惑是,在你发送EOF之前,程序不会打印最长的行。在bash中,您可以使用 CTRL + D 执行此操作。

示例:

[12:39pm][wlynch@watermelon /tmp] ./foo
test          // Then I hit enter
longest line  // Then I hit enter
short line    // Then I hit enter
one more      // Then I hit ctrl-D
longest line  // This is output from the program.

另一个例子:

如果我们使用重定向,我们可以更容易地看到输入和输出之间的差异。

[12:42pm][wlynch@watermelon /tmp] printf "longest line\nshort line" | ./foo
longest line

或使用输入文件:

[12:53pm][wlynch@watermelon /tmp] cat input.txt 
longest line
short line
foo
blah
[12:53pm][wlynch@watermelon /tmp] cat input.txt | ./foo
longest line

另一方面

另一方面,如果您希望程序在每个输入行之后打印当前最长的行,那么我们需要更改此程序中的代码。

以下是一个例子:

int main() {
    int len = 0;           /* current line length */
    int max = 0;           /* maximum length seen so far */
    char line[MAXLINE];    /* current input line */
    char longest[MAXLINE]; /* longest line saved here */

    while ((len = getline(line, MAXLINE)) > 0) {
        if (len > max) {
            max = len;
            copy(longest, line);
        }

        printf("Current longest line: %s", longest);
    }
}