簡體   English   中英

getc和fscanf之間的區別

[英]difference between getc and fscanf

為什么以下代碼工作正常:

#include<stdio.h>
int main()
{
     FILE *fp=fopen("input.txt","r+");
     char c;
     while((c=getc(fp))!=EOF)
     {
         printf("%c",c);
     }
     fclose(fp);
     return 0;
}

但是這段代碼給出了錯誤“分段錯誤,核心轉儲”:

#include<stdio.h>
int main()
{
     FILE *fp=fopen("input.txt","r+");
     char c;
     while((c=fscanf(fp,"%c",&c))!=EOF)
     {
         printf("%c",c);
     }
     fclose(fp);
     return 0;
}

input.txt包含一個空格分隔的字符列表,如:abcdef

這不會像你期望的那樣工作:

while((c=fscanf(fp,"%c",&c))!=EOF)

getc()返回字符讀取,可以是EOF ,但fscanf()返回分配的輸入項數,如果在發生任何轉換之前發生故障,則返回EOF

您不能將此返回值分配給c ,因為返回值不是讀取的字符(稍后您嘗試打印)。

你應該試試這個:

while(fscanf(fp,"%c",&c) == 1)

要么:

while(fscanf(fp,"%c",&c) != EOF)

這相當於說“只要有一個字符可讀......”

此外,在第一種情況下(使用getc()的代碼), c應該是int - 如果目標平台使用無符號字符,則可以有無限循環,因為c將始終轉換為正int(同樣,僅在具有無符號字符的平台中),因此永遠不會等於EOF 如果檢查getc()putc() (以及處理字符的其他函數putc()的聯機幫助頁,您將看到它們接收int ,而不是char

暫無
暫無

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

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