Scanf в визуальной студии не принимает несколько регистров символов - PullRequest
0 голосов
/ 08 мая 2019

Я создаю проект конвертации букв / цифр в таблицу ASCII. Мой код должен быть «интерактивным», поэтому пользователь будет набирать «y» или «n», чтобы отвечать на вопросы на экране. Тем не менее, он не хочет делать это дважды ...

Я пробовал:

  1. Просто пытаюсь числа вместо символов, но это не совсем то, что я хочу
  2. Техника %[\n]*c, %[\n]c и %[\n]*s ... но это не помогает; -;
  3. Тестирование в другом проекте, но единственный способ, которым я могу это сделать, - это чтобы несколько scanf() были в ряду.

Вот код:

printf("Would you like to convert a number today? \n");
printf("Please press Y or N \n");
scanf("%c", &input);

if (input == 'y' || input == 'Y') { //compare input if they said 'yes'
    printf("\nThank you! \nWhat number?\n");
    scanf("%d", &number);
    flag = test(number);
    if (flag == 0) { //if there is an equivalent letter
        letter = conversion(number); //find the equivalent letter
        printf("\nYour Number \t ASCII letter\n");
        printf("%d\t %c\n", number, letter);
    }
}
else if (input == 'n' || input == 'N') {
    printf("\nWould you like to convert a letter instead? This time enter 0 or 1\!\n\n"); //problem here!!
    printf("I wish I could say it was to \' Spice things up \' ...but it\'s not ;-; \n\n");
    scanf("%d", &input2);

    if (input2 == 0) { //this needs to be checking whether the user input Y/y
        printf("Great choice adventurer!\n");
        printf("What letter will it be today?\n\n");

        //..I would go to a different funtion here ie: test2(letter)...

        scanf("%d", &number); //I showed that it worked with multiple numbers, but I can't get this to work with multiple letters
        printf("%d", number);
    }

    if (input2 == 1) { //this needs to be checking whether the user input N/n
        printf("Difficult to please, I see...\n\n");
        printf("I suggest you move on with that attitude!\n\n");
        printf("Bye bye then\n");
    }
}
else { //if they tried to break the code
    printf("Sorry I did not recognise your command...please retry\n");
    printf("Press Y or N next time!\n");
}

Первая проверка работает отлично, я просто хочу, чтобы вторая проверка была похожа на первую! Некоторые «решения» вызвали переполнение, которое я не хочу , если возможно Даже если бы кто-то мог объяснить, почему это не работает так, как я хотел, это было бы очень полезно!

1 Ответ

3 голосов
/ 08 мая 2019

Я не уверен, что вас смущает.

Используйте

char foo;
scanf(" %c", &foo);

для отдельных символов, например.буквы и

int bar;
scanf("%d", &bar);

для чисел, целых чисел.Если вместо этого вы наберете букву, scanf() потерпит неудачу.

%[...] для строк.

scanf() возвращает количество успешных преобразований (или EOF), поэтому для

int height;
int width;
scanf("%d %d", &height, &width);

возвращает 2 в случае успеха.Он может вернуть 1, если только height может быть прочитан.

Поэтому, чтобы проверить наличие ошибок при вводе пользователем, вы должны сделать:

int height;
int width;
if (scanf("%d %d", &height, &width) != 2) {
    // handle the error, maybe exit the program.
}

Ваш код может выглядеть так (безобработка ошибок):

#define _CRT_SECURE_NO_WARNINGS  // you said Visual Studio? Without it you should get
                                 // warnings about some functions being insecure.

#include <ctype.h>   // isalpha()  returns true if the value is a letter
#include <stdlib.h>  // EXIT_SUCCESS
#include <stdio.h>   // puts(), printf(), scanf()

int main(void)
{
    for(;;) {  // for-ever ... endless loop since the user exits by answering
               // 'n' or 'N' two times

        puts("Would you like to convert a number today?\nPlease press Y or N:");
        char input;
        if (scanf(" %c", &input) != 1)  // We reached EOF ... end of file
            break;                      // that's improbable for stdin,
                                        // but input could be redirected to
                                        // read from a file instead.

        if (input == 'y' || input == 'Y') {
            puts("\nThank you!\nWhat number?");
            int number;
            scanf("%d", &number);

            if (isalpha((char unsigned)number))  // *)
                printf("\nYour Number \t ASCII letter\n%d\t %c\n\n", number, number);
            else
                puts("Sorry, but that's not the ASCII code of a letter :(\n");
        }
        else if (input == 'n' || input == 'N') {
            puts("\nWould you like to convert a letter instead?\nPlease press Y or N:");
            scanf(" %c", &input);

            if (input == 'y' || input == 'Y') {
                puts("\nGreat choice adventurer!\nWhat letter will it be today?");
                char letter;
                scanf(" %c", &letter);

                if (isalpha(letter))
                    printf("\nYour letter \t ASCII code\n%d\t %c\n\n", letter, letter);
                else
                    puts("Sorry, but that's not a letter :(\n");
            }
            else if (input == 'n' || input == 'N') {
                puts("\nDifficult to please, I see...\n\nI suggest you move on with that attitude!\n");
                puts("Bye bye then.");
                return EXIT_SUCCESS;
            }
        }
        else {
            puts("Sorry I did not recognize your command... Please retry.");
            puts("Press Y or N next time!\n");
        }
    }
}

*) isalpha() (и другие функции в <ctype.h>) ожидают значение, которое соответствует unsigned char или значение EOF,Он имеет неопределенное поведение для других значений.Поскольку мы читаем пользовательский ввод в int, мы не можем быть уверены, что это так, поэтому мы должны преобразовать значение в unsigned char, прежде чем передать его isalpha() (и друзьям).

В следующий раз, когда вы спроситевопрос, пожалуйста, включите ваш полный код, включая объявления переменных, такие функции, как test() и conversion() и #include s.Но, пожалуйста, опубликуйте пример, который фокусируется на вашей проблеме под рукой.Весь этот диалог, который вы включили, не был бы необходим.

...