2015-01-06 58 views
-1

我想從與函數原型怎麼寫getline函數的使用GETC

INT函數getline(FILE * PTR,字符*緩衝)一個txt文件得到線;

,但我有一個堆棧問題...

int getLine(FILE* ptr,char* buffer){ 
int c; 
while (c = getc(ptr) != EOF && c != '\n'){ 
    *buffer++ = c; 
    } 
*buffer = '\0'; 
return 1; 
} 

分割故障(核心轉儲)

+1

你恨括號? :)(while((c = getc(ptr))!= EOF)&&(c!='\ n 「))'。你怎麼知道'緩衝區'符合字符? –

+0

我不認爲有必要在每個表達式周圍編寫括號。 (c = getc(ptr)!= EOF)''將'0/1'賦給'c'並返回等價​​的布爾值,而'(c = getc(ptr) )!= EOF'根據從'getc'到'c'讀取的內容返回'true/false'。 –

+1

由於運算符的優先級,編寫'(c = getc(ptr))!= EOF'更重要。 –

回答

2

這裏

c = getc(file) != EOF 

你assignig比較的結果

getc(file) != EOF 

c,這就像如果你這樣做

c = (getc(file) != EOF) 

所以你應該增加,因爲operator precedence括號,所以校正代碼

while ((c = getc(ptr)) != EOF && c != '\n') 

你也應該確保你不會寫過去char *buffer傳遞給函數,所以傳遞它的大小,並迭代,直到找到'\n'或直到沒有更多空間。

我建議

int getLine(FILE* file, char* buffer, size_t size) 
{ 
    int c; 
    size_t count; 
    if (buffer == NULL) 
     return 0; 
    while ((size < count - 1) && ((c = getc(file)) != EOF) && (c != '\n')) 
    { 
     *buffer++ = (char)c; 
     count++; 
    } 
    *buffer = '\0'; 
    return 1; 
} 

你必須通過一個預先分配的緩衝區,並且它的大小,以防止出現嘗試添加字符過去的緩衝區的末尾。

0

調用函數我寫需要是

炭則strName [30];

,而不是

的char *則strName;

所以緩衝區需要預先分配... 和

getLine(fp,strName); 

調用而FP是FILE *

int getLine(FILE* ptr,char* buffer){ 
int c; 
while (((c = getc(ptr)) != EOF) && (c != '\n')){ 
    *buffer++ = c; 
    } 
*buffer = '\0'; 
return 1; 
}