【发布时间】:2013-12-28 17:08:53
【问题描述】:
“修改最长行程序的主程序,使其正确打印任意长输入行的长度,并尽可能多地打印文本。”
这是练习 1.16 的 K&R 答案簿中的完整代码:
#include <stdio.h>
#define MAXLINE 1000
int getline (char line[], int maxline);
void copy (char to[], char from[]);
main()
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = getline(line, MAXLINE)) > 0 ){
printf("%d %s", len, line);
if (len >max){
max = len;
copy (longest, line);
}
}
if (max > 0)
printf("%s", longest);
getchar();
return 0;
}
int getline(char s[], int lim)
{
int c, i, j;
j = 0;
for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
if (i < lim-2){
s[j] = c;
++j;
}
if (c == '\n'){
s[j] = c;
++j;
++i;
}
s[j] = '\0';
return i;
}
void copy (char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
看看getline函数,下面这行用lim-2代替lim-1的目的是什么:
if (i < lim-2){
这似乎根本没有任何目的。 '\0' 字符标记不应该出现在 s[lim] 而不是 s[lim-1] 或 s[lim-2]?
此外,如果超过字符限制,该函数将跳过最新的字符,直到找到换行符,并将换行符添加到 char 字符串,但跳过下一个“适合”字符来自过程中的输入流。这是什么目的?
我不太确定作者在这里的意图是什么,这本书也没有提供任何解释。
edit:使用诸如 line[5] 之类的数组,我的印象是字符数组中的 NULL 字符在 line[5] 中,我们可以在数组下标 0-4 中放入一些东西。这个假设是错误的吗?
【问题讨论】:
-
'\0'和'\n'需要减2。
-
数组长度被指定为“
limit总单位(字节)”。索引从array[0]到array[limit-1]。在这种情况下,s[lim-1]需要保存'\0'字节。请注意,POSIX 现在有一个getline()函数,其原型与 K&R 中的getline()完全不同。
标签: c