我有一个问题正在尝试解决! 如何在我的 C 限制下检查用户的有效输入?
我需要使用开关盒构建一个“银行模拟器”,用户提供一个字符,这将决定他将执行什么操作......
例如,如果用户输入 O
,他将开设一个新帐户。
现在我的问题是,我希望用户可以选择输入,例如,仅输入一个字符,但如果我使用:
scanf("%c", char)
并且用户在 OB33、B33 中输入的内容将保留在缓冲区中,程序将继续执行,直到下一个 scanf
。
我还尝试使用 %[OBDWCIPE]
和 fgets
等限制,但似乎没有任何方法可以解决验证输入的问题...
(我还需要对 INT 和 DOUBLE 执行相同的操作...)
我怎样才能避免它......?
最佳答案
根据您的代码注释,将该代码包装在 main 和 do/while 中。
使用充足的缓冲区 [100]。
在 fgets
中使用 sizeof buf
作为第二个参数。
在 buf[1] != "\n"
中使用单引号代替双引号。
#include <stdio.h>
int main ( void) {
char buf[100];
do {
printf("What actions would you like to do:");
fgets ( buf, sizeof buf, stdin);
if( '\n' != buf[1])
{
printf("not valid");
}
printf("string is: %s\n", buf);
} while ( '\n' != buf[1]);
return 0;
}
使用类似的 do/while 包裹 strtol
可以解析长整数。
last
是指向 strtol
处理的最后一个字符的指针。这里的有效输入是一个整数后跟一个换行符。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
int main ( void) {
char buf[100];
do {
printf("What actions would you like to do:");
fgets ( buf, sizeof buf, stdin);
if( '\n' != buf[1])
{
printf("not valid");
}
printf("string is: %s\n", buf);
} while ( '\n' != buf[1]);
long int value = 0;
char *last = NULL;
do {
printf("Enter an integer:");
fgets ( buf, sizeof buf, stdin);
value = strtol ( buf, &last, 10);
if ( ( errno == ERANGE && ( value == LONG_MAX || value == LONG_MIN))
|| ( errno != 0 && value == 0)){// parsing error from strtol
perror ( "value");
last = buf;
}
} while ( last == buf || '\n' != *last);
printf ( "value is %ld\n", value);
return 0;
}
关于c - 如何在我的 C 限制下检查用户的有效输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984678/