2012-02-25 69 views
3

私のCプログラムでは、ユーザからの入力を得るためにfgets()を2回呼び出します。しかし、(関数内にある)fgets()の2回目の呼び出しでは、入力が取られるのを待たずに、それを要求していないかのようにスキップします。ここに私のコードは、(ビットをダウン短縮)である:Cプログラミング - fgets()を2回呼び出す?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define ARE_EQUAL 0 

void rm_nl(char *c, int s); 
float ctof(); 
float ftoc(); 

int main() 
{ 
    char str[2];          // Setting vars 
    float result; 

    printf("Type 'C' or 'F': ");      // Prompt 

    fgets(str, 2, stdin);       // <-- First fgets 
    rm_nl(str, 2);         // rm_nl() removes the newline 
                // from input 
    printf("\n"); 

    if(strcmp(str, "C") == ARE_EQUAL || strcmp(str, "c") == ARE_EQUAL) 
    { 
     result = ctof();       // Compares strings and calls 
     printf("%.2f\n", result);    // function conditionally 
    } 
    else 
    { 
     result = ftoc(); 
     printf("%.2f\n", result); 
    } 

    return 0; 
} 

float ctof()           // One of the two functions 
{              // (they are almost the same) 
    char input[64]; 
    float fahr, cels;         // Local vars 

    printf("Type in a Celsius value: ");    // Prompt 

    fgets(input, 64, stdin);        // <-- Second fgets 
    rm_nl(input, sizeof(input)); 

     // Yadda yadda yadda 
} 


// Second function and rm_nl() not shown for readability 

このプログラムは何かを出力たい:

Type 'C' or 'F': (value)

、その後...

Type a Celsius value: 57.40 (I don't type this) 

(Program terminates) 

それは埋め57.40私もそれを入力していない!どうすれば違うのですか?

答えて

4
fgets(str, 2, stdin); 

あなたはfgetsのためにあまりにも小さなスペースを提供しています。 1文字だけを読み取ることができます(2には0ターミネーターが含まれているため)。

改行は常に入力バッファに残されますので、次のstdioオペレーションはそれを読み込みます。

+0

バッファを増やしてお知らせします。ありがとう! –

+0

完璧に作業しました!ありがとう!! –

関連する問題