我似乎现在理解了这个程序,除了getline
函数并不是很直观,因为它似乎将getchar()
返回的所有内容复制到一个字符数组s[]
中,但实际上从未用于任何重要的事情。
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;
}
这个函数可以很容易地忽略掉行
s[i] = c;
,因为这个函数真正做的就是计算字符数,直到EOF
或'\n'
从getchar()
返回。我真正不理解的是,为什么程序会按照以下主循环前进:
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;
}
唯一的解释是,
getchar()
函数在用户输入完整行文本并敲击回车键后才会生效。因此,在运行时它似乎有效。程序进展方式是否如此?程序首先进入while循环,然后等待用户输入一行文本,一旦用户按下回车键,getline
函数的for循环就会迭代。我觉得这应该是正确的,因为用户可以在输入期间输入backspace。我的问题是,程序究竟是如何前进的呢?全部都是由于getchar()
函数吗?当我在终端中按下ctrl-D时,会发生一些其他混乱的事情。如果我在新行的开头按下ctrl-D,程序将终止。如果我在填满一些文本的行的末尾按下ctrl-D,它不会终止,并且与按下enter键的方式不同。如果我在一行文本中多次按下ctrl-D,程序最终将终止。
这只是我的终端如何处理会话的方式,还是说这些都是我学习C时不必担心的事情?
我问这个问题的原因是我喜欢追踪程序以加深理解,但是
getchar()
函数让这变得棘手。
s[]
有多大,以及为什么sizeof s
给出的是指针的大小。(我并不是在暗示你不理解这个。)严格来说,该函数将s
视为指针;[]
运算符是基于指针算术定义的。 - Keith Thompson