scanf_s удаляет I char из буфера - PullRequest
1 голос
/ 19 января 2020

Я пишу программу для преобразования римских цифр в арабские c и наоборот. Программа работала отлично для обоих, пока я не добавил способ проверить, является ли ввод числа или строки.

Теперь все по-прежнему работает, за исключением того, что он игнорирует первый I в каждой строке на сканере (scanf_s). Этого не происходит ни с последующими I, ни с любыми другими буквами.

ie.

II читает I в romanString

IV читает V в romanString

XX читает XX в romanString

XIX читает XIX в romanString

Ответы [ 2 ]

3 голосов
/ 19 января 2020

I является частью Infinity, а scanf_s("%f",... потребляет I, но не может найти остальное и возвращает 0.

scanf(), и семейство - плохой способ для анализа вариантов форматов , Лучше прочитать строку с fgets(), а затем проанализировать строку .

или, если необходимо, использовать scanf_s() ...

    char romanString[100];
    float arabicNumber=0;

    printf("Enter roman or arabic number:");
    scanf_s("%99s", romanString, 99);  // should be scanf_s("%99s", romanString, 100);
    if (sscanf_s(romanString, "%f", &arabicNumber) == 1)
    {
        printf("Roman numerals: ");
        arabicToRoman(arabicNumber);
    }
    else
    {
        printf("Arabic numerals: ");
        romanToArabic(romanString);
    }   
0 голосов
/ 19 января 2020

Иногда я сталкиваюсь с подобными проблемами, попробуйте добавить перед всеми scanf_s команду fflu sh (stdin) (или fpurge (stdin), если вы кодируете с помощью Xcode).

"_fpurge () функция запрашивает, чтобы любые ожидающие данные в потоке были отброшены. " В этом случае данные ожидают на вашей клавиатуре.

...