2015-04-19 30 views
-1

我有兩個使用下面的fgets的場景。兩種情況都在同一個文件中,如下所示。fgets不提示用戶輸入。有什麼不同?

struct sth 
{ 
    char str[10]; 
    int num; 
}; 

void getIt(struct sth **M){ 
    char *b; 
    (*M)=malloc(sizeof(struct sth)); 

    printf("give me an integer:"); 
    fgets(b,1,stdin); // output must be an address 
    (*M)->num = atoi(b); 

    printf("give me a string:"); 
    fgets((*M)->str,10,stdin); 

} 


int main(int argc, char const *argv[]) 
{ 
    struct sth *myThing; 
    getIt(&myThing); 
    printf("Heres the string %s\n", myThing->str); 
    printf("Heres the num \n", myThing->num); 
    return 0; 
} 

這裏是輸出。請注意,它不會提示用戶輸入整數,它只是打印「給我一個整數」,然後直接移動到下一個打印語句。它爲什麼這樣做?

give me an integer:give me a string:sdf 
Heres the string sdf 

Heres the num 

這個小問題是一個更大的問題一個更大的問題,所以這僅僅是一個較大的一個縮影。

回答

2

您有:

fgets(b,1,stdin); // output must be an address 

然而,b一定要抱着你想讀給它的數據的有效地址。使用您的代碼,b被定義爲一個指針,但它不指向任何有效的地址。

東西沿着線:

char b[20]; // Make it large enough to hold the data 

是必要的。

我不確定你爲什麼要使用fgets讀取數據,並使用atoi將其轉換爲數字。另一種選擇是使用fscanf

+0

fscanf讀取無限數量的字符,這使得我試圖做的事情很危險。所以,我選擇了fgets。請記住,這個例子是一個更大的操作的一部分。 – Candic3

2
  1. 你還沒有爲b分配空間,fgets()預計它的第一個參數指向足夠的內存來存儲結果,足以感,大小你傳遞給它的第二個參數。

  2. 隨着尺寸參數爲1fgets()正在讀一個空字符串,你需要它至少3,因爲對於'\n'和終止nulfgets()需求空間。

    那麼試試這個

    char b[3]; 
    
    fgets(b, sizeof(b), stdin); 
    *M->num = atoi(b); 
    
  3. 您必須檢查malloc()沒有試着用指針任何事情之前返回NULL

相關問題