Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c程序获取输出_C_Compilation - Fatal编程技术网

从c程序获取输出

从c程序获取输出,c,compilation,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; /* cu

我编译了以下程序:

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

$ ./longest-line
Hello World
Hello Again

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

问题是,如果从键盘上按“\n”,由于此语句,getline将始终返回1

if (c == '\n') {
    s[i] = c;
    ++i;
}
而while((len=getline(line,MAXLINE))>0)将始终为真

但是,如果您使用文件作为标准输入,由于EOF,它可以正常工作


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

因此,在我的编译器上,我必须解决一些小问题

  • 通常,main应该写成
    intmain(){…}
    intmain(intargc,char**argv){…}
  • getline()
    与从
    #include
    中拉入的内置函数冲突,因此我只是将您的函数重命名为
    getline\u 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: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);
    }
}

为什么《C编程语言》一书中没有方括号?我是直接从书中抄来的。是的,但如果第二个在方括号外,则表示
[]
{}
是(卷曲的)大括号。我认为第二个if应该在循环之外,但你不会永远运行循环吗?你应该始终将
{}
与lops、if语句等一起使用。避免了很多错误,并使其他人(或你自己在几周后)更容易操作理解代码而不怀疑是故意的还是错误。@hyde这个例子来自“C编程语言(第二版)”一书的第一章。我直接抄的。但是,虽然它编译得很好,但我不知道如何让它在编译后输入时返回最长的一行。此外,还要将函数实现作为声明,即将两个函数移到文件顶部,并删除前向声明。这样可以避免链接器错误并减少所需的维护(即,更改函数签名只需要在一个位置更改代码)。是的,这正是我想要的,我也不得不重命名getline函数,但不必在main前面加int。@JohnMerlino:这里有一个合理的stackoverflow帖子,关于main的返回类型:注意,C89表示1989年发布的C标准,C99表示1999年发布的C标准,C11表示2011年发布的C标准。