[英]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.