继续并查看本帖子底部的实际问题
我可能试图理解那些非常简单的事情,但是直到我想出来之后我才能继续。
在阅读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
我的假设是,可能将EOF字符显示为^Z
在windows终端中,数组被截断为4个字符的长度加上一个空终止符。事实证明,如果我将EOF字符放在要读取的行中,则保存的行s[]
将只包含最大大小为5.还有什么让我感到困惑的是变量len
将始终为0是因为len
是在main()的while循环中分配的,并且在while循环被破坏时没有保存它的值?
对我来说很有意思,但可能没有经验的C用户,是getline()中for循环之后的if语句可以在for循环内部,也可以在外部,并且它不会更改程序。有意思,因为这并不意味着for循环是否执行正文中的任何代码,至少(c = getchar())是否被执行?
对不起,这个问题很刻薄,我感谢任何有用的评论/答案。
答案 0 :(得分:6)
因为MAXLINE
为5,getline
函数的读取次数绝不会超过MAXLINE - 1
。