从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
[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标准。