【发布时间】:2013-03-28 23:45:39
【问题描述】:
我现在似乎理解了这个程序,除了 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() 函数让这很棘手。
【问题讨论】: