Меню, которое принимает один символ на языке Си - PullRequest
2 голосов
/ 28 ноября 2010

Я хочу создать простое меню в программе на Си, которое принимает один символ.Меню будет выглядеть так:

  1. [S] как
  2. [E] xit

Если пользователь вводит «1», «s»или «S», программа выведет «Hello» и снова запросит ввод, если пользователь введет «2», «E» или «E», когда программа завершится.иначе он должен вывести «недопустимый ввод» и запросить снова.

Я могу создать программу, но проблема в том, что когда пользователь вводит 12, 13, 14, 15, 16 ..... так при запускес 1 он показывает Hello и то же самое для других опций.

Мой код:

#include <stdio.h>

void clearBuffer();


int main() {

    int i = 0;
    char selection;

    do
    {
        printf("\t1. [S]how\n");
        printf("\t2. [E]xit\n");
        printf("Enter your selection from the number or character noted above: ");
        scanf("%s", &selection);
        clearBuffer();

        if (selection == '1' || selection == 's' || selection == 'S')
            printf("Hello");
        else if (selection == '2' || selection == 'E' || selection == 'x')
            i = 0;

 } while(i != 0);



}

void clearBuffer()
{   

    while(getchar() != '\n');

}

Ответы [ 3 ]

3 голосов
/ 28 ноября 2010

Если вы собираетесь получить только один символ, рассмотрите возможность замены функции scanf () на getchar () function:

printf("Enter your selection from the number or character noted above: "); 
selection = getchar();
2 голосов
/ 28 ноября 2010

Вы можете использовать strlen , который является частью стандартной библиотеки C, чтобы проверить длину строки, возвращаемой scanf, и отклонить записи длиннее, чем один символ:

if (strlen(selection) > 1)
{
    printf("Invalid selection.");
}

В качестве альтернативы, я думаю, что вы могли бы использовать getchar (), чтобы принять только один символ от пользователя, что означает, что им не нужно будет нажимать ввод.

1 голос
/ 28 ноября 2010

Как уже упоминалось, вы должны использовать getchar(), если вам нужен только один символ. Если вы по-прежнему хотите использовать scanf() по любой причине, правильный формат - "%c", а не "%s".

Я бы также предположил, что если вы ищете один символ, блок if выглядит немного "занятым" (читай, неудобно) ... переключатель был бы более чистым и элегантным способом сделать это ( ИМХО).

/* something like this ... */
switch ( selection ) {
  case '1':
  case 's':
  case 'S':
    printf ( "Hello\n" );
    break;

  case '2':
  case 'e':
  case 'E':
    i = 0;
    break;
}

Другая пара вещей ... если вас не волнует случай чтения символа (т. Е. 's' и 'S' будут делать то же самое), вы можете преобразовать selection в верхний регистр перед вашим if -блоком или switch -блоком, используя toupper(). Кроме того, и это всего лишь совет по стилю, не используйте i в качестве флага выхода. Общая практика состоит в том, чтобы использовать такие значения, как i и j для счетчиков или индексов - вы можете использовать что-то вроде quit_now или user_done, которое более точно передало бы значение переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...