C-scanf()接受两个输入,而不是一个
我正在编写一个模拟掷骰子的程序,我被这段代码困住了:C-scanf()接受两个输入,而不是一个,c,C,我正在编写一个模拟掷骰子的程序,我被这段代码困住了: short diceNumber(){ unsigned short dice; do { printf("\nInput the number of dice to roll: "); if(!scanf("%hu", &dice)) { scanf("%*[^\n]"); scanf("%*c"); puts(""); puts("WRONG INPU
short diceNumber(){
unsigned short dice;
do {
printf("\nInput the number of dice to roll: ");
if(!scanf("%hu", &dice)) {
scanf("%*[^\n]");
scanf("%*c");
puts("");
puts("WRONG INPUT!");
}
else if(dice <= 0) puts("YOU MUST USE A DICE AT LEAST!");
}while(!scanf("%hu", &dice)|| dice <= 0);
return dice;
}
然后它又需要2(或另一个数字)。第一个输入未被扫描。但之前,在另一个函数中,“相同”语句起作用。代码如下:
void menu () {
unsigned short myAnswer;
puts("Choose the dice type");
puts("");
// A printf statement with all the options
puts("");
do {
// INPUT VALIDATION SECTION
printf("\nYour input: ");
if (!scanf("%hu", &myAnswer)) {
scanf("%*[^\n]");
scanf("%*c");
puts("");
}
// switch statement
} while (myAnswer < 1 || myAnswer > 17);
}
void菜单(){
未签名的简短回答;
放置(“选择骰子类型”);
认沽权(“”);
//包含所有选项的printf语句
认沽权(“”);
做{
//输入验证组
printf(“\n您的输入:”);
如果(!scanf(“%hu”,&myAnswer)){
scanf(“%*[^\n]”);
scanf(“%*c”);
认沽权(“”);
}
//开关语句
}而(myAnswer<1 | | myAnswer>17);
}
我尝试过不同的解决方案(比如fputs、fflush(stdin)、fflush(stdout)),但没有人奏效。您能帮助我吗?您不应该在while语句中使用scanf。这将强制用户输入新号码 问题是if语句中的“scanf”接受两个输入,而不是一个 否。上面的代码有一组3个
scanf()
和另一个第四个scanf()
。这是第四个导致“接受两个输入而不是一个输入”的原因
3scanf()
要修复代码并仍采用此想法,请执行以下操作:
int diceNumber(void) {
unsigned short dice;
for (;;) {
printf("\nInput the number of dice to roll: ");
fflush(stdout); // insure output is seen
int count = scanf("%hu", &dice);
if (count == 1) {
if (dice <= 0) puts("YOU MUST USE A DICE AT LEAST!");
else break;
} else if (count == EOF) { // This case omitted in original code.
return EOF;
}
scanf("%*[^\n]"); // consume almost all of rest of line
scanf("%*c"); // consume rest of line (expected \n)
puts("");
puts("WRONG INPUT!");
// if(dice <= 0) not possible for unsigned short
}
return (int) dice;
}
int-diceNumber(无效){
无符号短骰子;
对于(;;){
printf(“\n输入要掷骰子的数量:”;
fflush(stdout);//确保看到输出
int count=scanf(“%hu”&骰子);
如果(计数=1){
如果(用三个scanf
调用来判断你在做什么,我猜这是为了处理无效输入并跳过行的其余部分?那么你为什么不把整行内容读入一个缓冲区,然后在该缓冲区上使用sscanf
?至于你的问题,有多少scanf(%hu),&dice)
您进行了哪些调用?非工作循环和工作循环之间有很大的区别(提示:仔细查看它们的条件)。除此之外:!scanf(“%hu”,&dice)
应该是scanf(“%hu”,&dice)!=1
否则您将无法拾取EOF
返回。另外dice
也不能<0
@Someprogrammerdude是的,我使用三个scanf呼叫来处理无效输入。我可以尝试使用sscanf。@风向标是的,是的,您是对的!我两个小时后就不在笔记本电脑前了,但我一直在手机上查看代码,多亏了@Someprogrammerdude建议我找到了问题所在。顺便说一句,谢谢!我通过从do…while循环中删除scanf解决了代码中的问题。顺便说一句,我想我会实现这个版本。下次我会尽量记住使用返回值!
int diceNumber(void) {
unsigned short dice;
for (;;) {
printf("\nInput the number of dice to roll: ");
fflush(stdout); // insure output is seen
int count = scanf("%hu", &dice);
if (count == 1) {
if (dice <= 0) puts("YOU MUST USE A DICE AT LEAST!");
else break;
} else if (count == EOF) { // This case omitted in original code.
return EOF;
}
scanf("%*[^\n]"); // consume almost all of rest of line
scanf("%*c"); // consume rest of line (expected \n)
puts("");
puts("WRONG INPUT!");
// if(dice <= 0) not possible for unsigned short
}
return (int) dice;
}