我现在似乎理解了这个程序,除了这个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()
在用户输入整行文本并enter按下键后,该功能会发挥作用。所以它似乎在运行时工作是我的猜测。
这是程序的进展方式吗?程序是不是先进入while循环,然后等待用户输入一行文本,一旦用户敲回车,getline
就迭代函数的for循环?我觉得情况就是这样,因为用户可以在输入backspace期间输入。
我的问题是,该计划到底是如何推进的?都是因为getchar()
功能吗?
当我在终端中点击ctrl-D时,会发生其他一些令人困惑的事情。如果我在换行符的开头点击ctrl- ,程序将终止。D如果我在填充了一些文本的行的末尾点击ctrl- D,它不会终止,并且它的行为方式与点击enter. 如果我在一行文本中点击ctrl-D几次,程序最终将结束。
这只是我的终端处理会话的方式,还是如果我只想学习 C 语言,这些都是我不应该担心的?
我问的原因是我喜欢跟踪程序以更好地理解它,但是getchar()
函数使这很棘手。