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()
。这是第四个导致“接受两个输入而不是一个输入”的原因

3
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;  
}
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;  
}