在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
开始 - 假,我不会得到任何字符串?
答案 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)的长度。