我以下的书“C程序设计语言”的运动之一: http://users.powernet.co.uk/eton/kandr2/krx116.html奇怪算法用C
在下面的程序中,如果输入文件包含行“^ h \ N”,例如getline函数将i和j初始化为0.由于'h'不是EOF或'\ n',因此j为0,因此执行循环中的块,将c分配给s数组指针的0索引。 j增加到1.然后块结束,i计数器递增到1.循环检查下一个字符是否是'\ n',并且是,所以块退出。此时,i和j都等于1.由于c等于'\ n',所以c被插入到s指针的索引1中,因为j是1.然后j递增到2.然后i递增到2.然后,空终止符'\ 0'插入到s指针的索引2中,因为j是2.然后函数返回2,因为i也是2.
我看不到j变量。因为当它增加时,我也是如此。有人说我错了:
“因为它们以不同的速率递增,i计数器用于跟踪字符串的长度,j变量在处理结束时将点空终止符需要进入字符串。“
但我说因为我和j是相同的值(一个只是增加了另一个),你可以使用我到空终止符需要去的地方,因为我也会等于2在我的上面的例子。
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print longest input line */
int main(void)
{
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)
{
printf("%d: %s", len, line);
if(len > max)
{
max = len;
copy(longest, line);
}
}
if(max > 0)
{
printf("Longest is %d characters:\n%s", max, longest);
}
printf("\n");
return 0;
}
/* getline: read a line into s, return length */
int getline(char s[], int lim)
{
int c, i, j;
for(i = 0, j = 0; (c = getchar())!=EOF && c != '\n'; ++i)
{
if(i < lim - 1)
{
s[j++] = c;
}
}
if(c == '\n')
{
if(i <= lim - 1)
{
s[j++] = c;
}
++i;
}
s[j] = '\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;
}
}
我是对还是错?
想想当你尝试阅读一条很长的路线时会发生什么。你只是使用错误的测试用例来充分理解它。 –
是的,我没有编译器,但它看起来像'i == j'到一定程度,但它们确实有分歧。如果行的长度与MAXLINE相同, –
会不会导致缓冲区溢出,导致行[s] ='\ 0' –