scanf_s从缓冲区中删除I char

问题描述 投票:1回答:2

我正在编写一个程序,将罗马数字转换为阿拉伯数字,反之亦然。在我为程序添加了一种检查输入是否为数字或字符串的方法之前,该程序对于这两种程序均运行良好。

现在,除了忽略扫描器上每个字符串中的第一个I之外,其他所有内容仍然有效。随后的Is或任何其他字母都不会发生这种情况。

II将I读入romanString

IV将V读入romanString

XX将XX读入romanString

XIX将XIX读入romanString

c string scanf visual-studio-2019
2个回答
3
投票

[IInfinity的一部分,scanf_s("%f",...消耗了I,但找不到其余的并返回0。

scanf()和family是解析变体格式的不良方法。最好用fgets()读取line,然后解析string

或如果需要使用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
投票

我有时会遇到这类问题,请尝试在所有scanf_s之前添加命令fflush(stdin)(如果使用Xcode进行编码,则添加fpurge(stdin)。)>

“ _ fpurge()函数请求丢弃流中的所有未决数据。”在这种情况下,键盘上的待处理数据。

© www.soinside.com 2019 - 2024. All rights reserved.