为什么我们要使用额外的表达方式?
这是Kernighan&Ritchie的" The C Programming Language"的示例:
int getline(char s[], int lim) { int c, i = 0; while (--lim > 0; && (c=getchar()) !=EOF && c !='\n') { s[i++] = c; } if (c =='\n') { s[i++] = c; } s[i] = 'int getline(char s[], int lim) { int c, i; i=0; /* While staying withing limit and there is a char in stdin and it's not new line sign */ while (--lim > 0; && (c=getchar()) !=EOF && c !='\n') /* Store char at the current position in array, advance current pos by one */ s[i++] = c; /* If While loop stopped on new-line, store it in array, advance current pos by one */ if (c =='\n') s[i++] = c; /* finally terminate string with ##代码## */ s[i] = '##代码##'; return i; }'; return i; }
尽管之后我们使用s [i ++] = c
,为什么还要检查c!='\ n'
?
解决方案
回答
我们只需要退出新行的while循环即可。否则,我们将不得不在身体检查时使用并休息一下。
回答
进行比较是为了确保readline在遇到换行符(" \ n")时终止。在执行此操作的迭代中,它终止时没有在字符串中添加换行符,因此,即使达到了其他终止条件之一,该语句也可确保该字符串始终以换行符终止。
回答
这样可以确保即使不是输入的结尾,我们也可以在行的结尾处停止。然后,如果有换行符,将\ n添加到该行的末尾,并且我又增加了一次以避免避免用\ 0覆盖它。
回答
##代码##回答
该功能从标准输入读取字符,直到找到EOF或者换行符为止。
第二个检查确保将唯一的换行符放入char数组中。 EOF不应出现在适当的C字符串中。另外,如果字符不是换行符,则意味着我们可能已经填满了c字符串,在这种情况下,我们不应在其中添加更多字符。
注意,我们仍然添加" \ 0"。我们确保在c字符串中还有一个字符空间,因为我们使用了前缀递减器,该变量在比较之前进行评估。
回答
我不确定我是否理解这个问题。 c!='\ n'
用于在出现行尾(换行)时停止读取行。否则,即使它在极限之前结束,我们也将一直读取直到极限。如果已达到换行,则while循环中的第一个s [i ++] = c;不会发生。这就是为什么以后要进行特殊测试的原因,而其他s [i ++] = c;
则是如果换行符破坏了循环。
回答
没有回答问题,但是我还是会写一些评论:
我不记得所有的K&R规则,但是如果lim等于1,那么我们列出的功能将失败。然后,我们将不会运行使c保持未初始化状态的循环,但是我们仍将在if(c =='\ n')检查中使用该变量。
而且while(--lm> 0; ...)不会通过编译器。除掉 ';'确实如此。
回答
代码中有一个错误。
如果s的大小为N个字节,并且用户键入换行符作为第(N-1)个字符,则第N个字符将变为'\ n',第(N + 1)个字符(未分配)将变为成为'\ 0'。