K& R getline的ANSI C编程: - lim> 0或lim - > 0?

时间:2014-12-28 15:09:37

标签: c

在K& R的ANSI C编程的第69页上,有一个函数的例子,它作为Unix程序grep的特殊版本。

代码是:

#include <stdio.h>
#define MAXLINE 1000 //max input length
int getline(char line[], int max); 
int Strindex(char source[], char searchfor[]); 
char pattern[] = "ould"; 

int main()
{ 
    char line[MAXLINE];
    int found =0;

    while (getline(line,MAXLINE) > 0)
        if (Strindex(line, pattern)>=0){
        printf("%s", line); 
        found ++; 
        }
    return found;
} // end of main function


int  getline (char s[], int lim) 
{ 
    int c, i; 
    i = 0;
    while (--lim > 0 && (c=getchar()) != EOF && c!= '\n')
        s[i++] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';
    return i;
}


int Strindex (char s[], char t[])
{ 

    int i,j,k; 
    for (i =0; s[i] != '\0'; i++)
        for (i =i, k=0; t[k] != '\0' && s[j] == t[k]; j++, k++); 
    if (k > 0 && t[k] == '\0')
        return i;

}
return -1; 

} // end of strindex

不是错误:--lim > 0?如果MAXLINE在我的情况下为1,我会在while 0>0开始 - 假,我不会得到任何字符串?

1 个答案:

答案 0 :(得分:2)

是的,你是对是错。你会得到一个空的NUL终止字符串(lim应该包含终止NUL字符)。有效的C字符串应该终止NUL,甚至零长度字符串至少包含一个字符。因此,如果您的MAXLINE为1,它已经已满,且无法再保留任何字符。

while (--lim > 0 && (c=getchar()) != EOF && c!= '\n')
    s[i++] =c; 
if (c =='\n')
    s[i++] =c; 
s[i] = '\0' ;

最后一个语句s[i] = '\0'正在分配NUL字符,在您的情况下为s[0] = '\0';。此外,getline函数正确地在下一个语句return i;中返回捕获的字符串(= 0)的长度。