2016-02-06 3 views
2

В основном, как говорится в заголовке. Когда моя программа запускается с консоли, она спросит, хотите ли вы зашифровать или дешифровать. И когда я вводил e или E, это создает новую пустую строку (пока я не введу какой-то текст), а затем сразу откроет строки «введите текст» и «введите ключевые строки».Программа пропускает fgets без ввода ввода

Итак, в консоли это выглядело бы примерно так:

Вы хотите (E) ncrypt или (D) ecrypt? e

asdf jkl; < ---- случайного ввода пользователя, чтобы получить программу, чтобы продолжить ..

Введите текст, который вы хотели бы, чтобы зашифровать: Введите ключ для шифрования: (вход пользователя)

, а затем завершает работу программы ..

//message to be encrypted 
char text[250]; 
//word to use as the key 
char key[50]; 
//stores the encrypted word 
char encrypted[250]; 

char answer; 
printf("Would you like to (E)ncrypt or (D)ecrypt? "); 
scanf(" %c", &answer); 

if(answer == 'e' || answer == 'E') 
{ 
    printf("Enter the text you want to encrypt : "); 
    fgets(text, 250, stdin); 

    printf("Enter a key to use for encryption : "); 
    fgets(key, 50, stdin); 

    printf("Encrypted text : "); 

    //code that encrypts the text here  
} 

Таким образом, проблема, то, что это пропуск fgets полностью и не дожидаясь/позволяя пользователю вводить любые ответы .. почему для?

+2

'scanf ("% c ", & answer);' оставляет в строке ввода 'newline'' входной буфер, который берется 'fgets': избавиться от него. –

+0

@Weather Vane, который имеет большой смысл (извините, первая неделя обучения c). Как вы собираетесь избавиться от новой строки, оставшейся во входном буфере? – swimmingpoole

ответ

3

Линия scanf(" %c", &answer); оставляет во входном буфере newline, который берет на себя fgets. Ведущее место в " %c" потребляет ведущий пробел, но не trailing пробел.

Вы можете избавиться от newline с форматом "%*c" спецификатора в scanf который читает newline но отбрасывает его. Аргумент var не требуется.

#include <stdio.h> 

int main(void) 
{ 
    char answer; 
    char text[50] = {0}; 
    scanf(" %c%*c", &answer); 
    fgets(text, sizeof text, stdin); 
    printf ("%c %s\n", answer, text); 
    return 0; 
} 
+0

Это прекрасно, и очень хорошо написано/понято. Спасибо за ваше время и помощь! – swimmingpoole

+0

Протестировал его с полным кодом, и он отлично работал. Еще раз спасибо! – swimmingpoole

2

От http://www.cplusplus.com/reference/cstdio/fgets/

«читает символы из потока и не сохраняет их в виде строки C в ул до (Num-1) символы были считаны или либо перевод строки или конец файла-достигается, в зависимости от того происходит первый."

Предположительно, вы нажимаете Enter после ввода E или D. Ваш scanf() не использует новую строку, чтобы он оставался во входном потоке. fgets() видит новую строку и возвращает.

+0

Есть ли какая-то конкретная логическая причина, по которой scanf не использует новую строку? – tom

+0

и будет ли это исправлено fflush (stdin)? – tom

+0

@tom 'fflush (stdin)' не является стандартным. Ведущее пространство в ''% c ''потребляет * ведущее * пробельное, но не * конечное * whitespace. –

Смежные вопросы