c - 我的 C 程序无法识别有效输入,认为这是因为换行问题
问题描述
我有一个 C 程序,它应该评估用户输入的是 aH
还是M
. 我有一些输入验证以确保用户输入H
或M
。但是,当输入这些内容时,程序会将其视为用户输入了其他内容。我有一种感觉,这是因为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;
}
谢谢你的帮助,我真的很感激。
解决方案
添加正确的标题。然后启用编译器警告并再次编译。
主要是,您将字符串文字 ( "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 表达式的值是多少?
推荐阅读
- javascript - 如何有效地在一页上有许多只读的摩纳哥差异视图?
- c# - CORS preflight OPTIONS 请求从 Windows Authenticated web api 返回 401(未授权)
- testcomplete - “错误停止”列不显示
- python - 如何遍历整个 JSON 文件并将数据提取到变量中
- javascript - 在散景中显示裁剪的图像
- c# - MySql.Data.MySqlClient 调用存储过程时出错
- vba - 使用 VBA 更新 SharePoint 选择字段
- python - Openpyxl:如何向所有列添加过滤器
- reactjs - 在 react native 中将 props 传递给孩子
- wamp - WAMP 虚拟主机允许外部设备