Программирование на C - Вызов fgets () дважды? - PullRequest
3 голосов
/ 25 февраля 2012

В моей C-программе я вызываю fgets() дважды, чтобы получить ввод от пользователя. Однако при втором вызове fgets() (который находится в функции) он не ожидает ввода, а просто пропускает его, как будто даже не запрашивает его. Вот мой код (немного сокращен):

#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 без меня, даже печатая его! Что я должен делать по-другому?

1 Ответ

4 голосов
/ 25 февраля 2012
fgets(str, 2, stdin);

Вы предоставляете слишком мало места для fgets. Вы разрешаете ему читать только один символ (так как 2 включает в себя 0-терминатор).

Новая строка всегда будет оставаться во входном буфере, поэтому следующая операция stdio будет читать его.

...