我以下的書「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' –