簡體   English   中英

從文件中讀取字符串后打印未知字符

[英]Printing unknown characters after reading string from a file

我有一個從文件讀取的功能:

void input(char* buffer, FILE* fp)
{
    char temp[100];
    fgets(temp,100,fp);
    strcpy(buffer,temp);
    buffer [strlen(buffer)-1]=0;
}

我提交:

1
2
3
4
5

最后一行以換行符結尾。
我嘗試以這種方式讀取文件:

FILE* fp=fopen("myfile.txt","r");
while(!feof(fp))
{
    char buffer[100];
    input(buffer,fp);
    puts(buffer);
}

它成功讀取所有五個字符串:“ 1”,“ 2”,“ 3”,“ 4”,“ 5”並進行打印,但是在打印了第5個字符串后,出現了分段錯誤。

這是C語言(實際上是其他語言)中常見的反模式,它可以像您一樣建立一個循環,檢查!feof(fp) 問題在於該函數僅由於EOF導致讀取失敗后才返回true。 問題是您在檢查讀取是否成功之前使用讀取的結果。

我建議您檢查fgets()的返回值,如果有EOF,它將返回NULL 向后傳播該值,並從input()函數返回它。 然后在循環條件下使用它。

只需添加一下,seg錯誤本身就可能在您對strcpy()調用中。 fgets()失敗時,您嘗試復制未初始化數據的緩沖區,該緩沖區可能包含所有內容,而strcpy()可能會找到比緩沖區長得多的“字符串”。 即使碰巧找到更短的內容,您的結果仍然是垃圾。

看起來像

buffer [strlen(buffer)-1]=0;

在最后一個空白行,strlen為0,並且緩沖區設置超出其范圍。

指示字符串結尾的字符不是'0'而是'\\ 0',因此請替換此行:

  buffer [strlen(buffer)-1]=0;

通過

  buffer [strlen(buffer)-1]='\0';

它應該很好:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM