我编写了以下程序:
#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
什么都没发生。它应该打印最长的一行。
答案 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)
所以,在我的编译器上,我不得不解决一些小问题。
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);
}
}