2016-07-18 2 views
0

Если я хочу, чтобы пользователь вводил один символ, как бы я сделал это на языке c. Моя попытка на этом ниже, но это было ужасно. Из того, что я читал в Интернете, я слышал, что вы можете использовать функцию gets или fgets для выполнения этого, но я не мог понять, как это сделать.Как я могу позволить пользователю вводить один символ в c

do 
{ 
    geussNumber += 1; 
    printf("Enter guess number %d\n", geussNumber); 
    scanf(" %c", &geussLetter); 
    scanf ("%c", &inputViolation); 
     if (isalpha(geussLetter) == 0) 
     { 
      printf("You did not enter a letter\n"); 
     } 
     else if (inputViolation == true) 
     { 
      printf("You eneterd more than one letter\n"); 
     } 
     else 
     { 
     inputLoopEnd = 1; 
     } 
} 
while(inputLoopEnd == false); 
+0

'inputViolation == true' выглядит ужасно ... Я думаю, что его нужно сравнивать, по крайней мере, с каким-то персонажем. – MikeCAT

+1

Нет, 'gets()' не может использоваться, потому что он имеет неизбежный риск переполнения буфера, устарел на C99 и удален из C11. – MikeCAT

+0

Я думал, что если он читает что-либо, кроме 0 (true в c) на входной строке, пользователь вводит более одного символа. –

ответ

-1

Не используйте такие вещи, как fgets() или fputs() и т.д. ... Они падают из употребления.

Как вы можете видеть из описания here ... эта функция предназначена для обработки объектов типа str, и вы в большей степени сосредоточены на использовании символов в данный момент, так почему бы не просто обрабатывать только символы, чтобы облегчить жизнь.

Вы не можете сделать это так, как вы думаете, вы можете ...

scanf(" %c", &geussLetter); 
scanf ("%c", &inputViolation); 

Это не может работать, потому что даже если пользователь вводит в только один символ, как они, как предполагается, она по-прежнему чтобы инициировать вашу схему ввода.

Edit: 12:14 вечера 7/20/2016

мне очень нравится элегантность MOHAMAD's solution на вики сообщества.

Так что я отредактировал, чтобы соответствовать вашей ситуации, и здесь хорошо работает. Такая же идея ...

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

int clean_stdin() 
{ 
    while (getchar() != '\n'); 
    return 1; 
} 

int main(void) 
{ 
    int first_time_around = 0; 
    char theguess = 0; 
    char c; 
    do 
    { 
     if (first_time_around == 0) 
      first_time_around++; 
     else 
      printf("Wrong input \n"); 

     printf("Enter guess number: \n"); 

    } while (((scanf("%c%c", &theguess, &c) != 2 || c != '\n') 
      && clean_stdin()) || !isalpha(theguess)); 

    return 0; 
} 
+0

Должен любить, когда кто-то голосует за ответ без конструктивной критики. Спасибо <.< ^.^ >.> –

+0

@JeremyGarnet Спасибо за отличный ответ, но я не понимаю, что вы подразумеваете под этим я должен сохранить символ, используя метод substr(). –

+0

@JMaklen Я нашел гораздо лучшее решение в вики сообщества, и это хорошо подходит для вашей ситуации. –

3

Вы можете использовать семейство функций getc.

Обратите внимание, например, на http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/.

+1

Я бы точно не назвал их «семейством функций getch», потому что вопрос о ** C **, тогда как именование всего семейства функций после одного, что даже не является членом стандарта C I/O, но является частью расширения Microsoft '' будет ошибочным. «' 'функция getc' будет более корректной. – user3078414

+0

Вы правы, спасибо. Я обновил свой ответ. –

0

Кажется, что вы хотите прочитать ввода одной строки в то время (т.е. пользовательских типов один букв угадать, а затем < войти>), и вы хотите, чтобы убедиться, что догадка действительно содержит только одну букву. Смысл проблемы в этих терминах, возможно, дает более четкое представление о том, как можно применять fgets(), поскольку целью этой функции является чтение одной строки за раз. Прочитав целую строку - или, по крайней мере, столько, сколько может быть в буфере, - вы можете проверить ее и извлечь предположение.

scanf() сложно использовать должным образом, поэтому я рекомендую подход fgets(). Если вы настаиваете на использовании scanf(), однако, то вы можете сделать это следующим образом:

// consumes leading whitespace, inputs one character, then consumes any 
// immediately-following run of spaces and tabs: 
int result = scanf(" %c%*[ \t]", &guessLetter); 

if (result == EOF) { 
    // handle end-of-file ... 
} else { 
    assert(result == 1); // optional; requires assert.h 

    int nextChar = getchar(); 

    if ((nextChar == '\n') || (nextChar == EOF)) { 
     // handle multiple-character guess ... 
    } else if (!isalpha(guessLetter)) { 
     // handle non-alphabetic guess ... 
    } else { 
     // it's valid ... 
    } 
} 
+0

Почему у вас есть этот код? (результат == EOF) Я получаю входные данные от входного потока, который пользователь ввел не в файл? –

+0

@JMaklen, конец файла может также встречаться на стандартном входе любым из нескольких способов. Даже если вы не ожидаете, что это приведет к обычному использованию вашей программы, это плохая форма предположить, что этого никогда не произойдет. –

+0

Как я могу получить EOF, если я использую scanf? Пользователь может ввести значение, но как он может ввести файл? –

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