2014-12-28 113 views
2

從ANSI C編程K & R第69頁,有一個函數的例子,它作爲Unix程序grep的特殊版本。通過K&R getline進行ANSI C編程:--lim> 0或lim - > 0?

的代碼是:

#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

你從哪裏得到'MAXLINE'會是1的想法? – Nit

+0

有這個代碼塊:if(c =='\ n') s [i ++] = c;如果'lim'的測試改變了,它將超出輸入緩衝區。 – user3629249

+2

而且什麼都不讀的行爲是正確的,因爲一個1字符的緩衝區只能保存字符串的空終止符而不是任何數據。請注意,此練習已被POSIX標準捕獲(超越);現在有一個標準函數['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html),它具有與這個'getline()'完全不同的接口。 –

回答

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'被分配空字符,而你的情況是s[0] = '\0';。此外,getline函數正確地返回下一條語句return i;中捕獲的字符串的長度(= 0)。

+3

小心:NULL是一個空指針常量,而不是空字節或「'\ 0」。還要注意,字符串的長度不包含空終止符(標準很清楚:_A字符串是一個連續的字符序列,由第一個空字符結尾幷包括第一個空字符。...字符串的長度是空字符前面的字節數._ –

+0

@JonathanLeffler謝謝,我編輯了有關NULL的內容。但我認爲我是對的。 –

相關問題