【发布时间】:2012-10-31 16:08:08
【问题描述】:
继续查看本文底部的实际问题
我可能试图过多地理解真正简单的事情,但在弄清楚这一点之前我无法继续。
在阅读 K&R 1.9 字符数组时,您遇到了一个示例程序,该程序接受输入并确定哪一行最长,然后重新打印。
为了理解这个程序的getline函数,我稍微修改了一下,在它的执行过程中打印了一些信息。现在我发现了一些输入,一旦我理解了这些输入,应该会大大增强我对 getchar() 的理解。
附带说明,当我尝试从库中读取源代码时,我完全不知所措。例如,我尝试寻找 getchar() 并最终目瞪口呆地盯着 stddef.h 的第 300 行某处的 18 #endif 塔。我将通过在不久的将来停止对 stdio.h 中的功能的追求来避免这种头痛。图书馆很难找到东西是正常的吗?该函数不应该作为可读源存在,还是我只是抱有希望?
为了方便起见,我将继续从 K&R 发布整个修改后的程序:
#include <stdio.h>
#define MAXLINE 5 /* 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\n", longest);
printf("INFO: max = %d\n", max);
printf("INFO: sizeof s[] = %d", sizeof 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;
printf("INFO: s[%d] = %c\n", i, c);
if (c == '\n') {
printf("INFO: %d\n", i);
printf("INFO: s[%d] = \\n\n", i);
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;
}
这是一些输入/输出示例:我正在使用 CodeBlocks 和 Windows 7
最后,我的问题是为什么 getline() 函数中的 for 循环在到达 F 后离开循环,因此将空终止符放在 F 之后作为 \0
我的假设是,也许将显示为^Z 的 EOF 字符放在 Windows 终端中,数组被截断为 4 个字符加上一个空终止符的长度。事实证明,如果我将 EOF 字符放在要读取的行中,则保存的行 s[] 将只包含最大大小为 5。同样让我感到困惑的是变量 len 将始终为 0,是因为len 是在 main() 的 while 循环期间分配的,并且一旦 while 循环中断,它的值就不会保存?
对我来说有趣但对于有经验的 C 用户可能不感兴趣的是,getline() 中 for 循环之后的 if 语句可以在 for 循环内部或外部,它不会改变程序。有趣,因为这不意味着无论 for 循环是否执行主体中的任何代码,至少 (c=getchar()) 都会被执行?
抱歉这个问题太罗嗦了,感谢任何有用的 cmets/answers。
【问题讨论】:
标签: c codeblocks kernighan-and-ritchie