首页 > 解决方案 > 我的 C 程序无法识别有效输入,认为这是因为换行问题

问题描述

我有一个 C 程序,它应该评估用户输入的是 aH还是M. 我有一些输入验证以确保用户输入HM。但是,当输入这些内容时,程序会将其视为用户输入了其他内容。我有一种感觉,这是因为scanf在输入中添加了换行符,导致比较失败。我正试图找到去除这个换行符的方法,但我没有运气。我试过把它放在getchar()后面scanf,但是没有用。我试过使用fgets,但也没有用。我尝试将格式指示器从更改%s%c,但没有奏效。

这是整个过程:

char GetEmployeeStatus()
{
    // declare variable
    char strEmployeeStatus = "";
    int intEmployeeStatusResult = 1; // assume valid input

    do
    {
        // get user input
        printf("Please enter the employee's status: H for hourly or M for management. \n");
        intEmployeeStatusResult = scanf("%s", &strEmployeeStatus);

    } while (intEmployeeStatusResult == 0 || strEmployeeStatus != "H" || strEmployeeStatus != "M");

    return strEmployeeStatus;
}

谢谢你的帮助,我真的很感激。

标签: cscanfnewline

解决方案


添加正确的标题。然后启用编译器警告并再次编译。

主要是,您将字符串文字 ( "foobar") 与字符文字 ( 'x') 混合在一起;这就是 GCC 关于初始化的内容:

blah.c: In function ‘GetEmployeeStatus’:
blah.c:6:30: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
     char strEmployeeStatus = "";
                              ^~

来自比较的类似警告。

还要考虑%s转换的scanf()作用。从 Linux 手册页:

s
匹配一系列非空白字符;下一个指针必须是指向字符数组的初始元素的指针,该元素的长度足以容纳输入序列和自动添加的终止空字节 ('\0')。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。

在您的代码中,strEmployeeStatus这里只有一个字符。但是,您正确地给出scanf()了一个指向字符的指针,因此编译器很难对此发出警告。

char strEmployeeStatus;
scanf("%s", &strEmployeeStatus);

然后,循环条件:strEmployeeStatus != "H" || strEmployeeStatus != "M". 那是(X 不是 A 或 X 不是 B)。当 X 是 A、B 或 C 时,在这样的表达式中会发生什么?子表达式的值是多少,那么在每种情况下整个 OR 表达式的值是多少?


推荐阅读