【问题标题】:Reading character with scanf()使用 scanf() 读取字符
【发布时间】:2013-07-04 01:01:14
【问题描述】:

此代码适用于掷骰子游戏

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

int roll_dice(void);
bool play_game(void);

int main()
{
   int i, ch,win = 0,lose = 0;
   bool flag;
   srand((unsigned)time(NULL));

   do
   {
       flag = play_game();
       if(flag)
       {
           printf("You win!");
           win++;
       }
       else
       {
           printf("You lose!");
           lose++;
       }

       printf("\n\nPlay again(Y/N)? ");
       scanf("%c", &ch);
       ch = getchar();
       printf("\n");
   }while(ch == 'Y' || ch == 'y');

   printf("\nWins: %d   Losses: %d",win,lose);
   return 0;
}

int roll_dice(void)
{
    return rand()%6 + rand()%6 + 2;
}

bool play_game(void)
{
   int sum = roll_dice();

   printf("You rolled: %d\n", sum);
   if(sum == 7 || sum == 11)
       return 1;
   else if(sum == 2 || sum == 3 || sum == 12)
       return 0;    
   else
   {
       int point = sum;
       printf("Your point is: %d\n", point);
       do
       {
           sum = roll_dice();
           printf("You rolled: %d\n", sum);
           if(sum == 7)
               return 0;            
       }while(point != sum);
       return 1;
   }                    
}

我只有代码 sn-p 有问题

 printf("\n\nPlay again(Y/N)? ");
 scanf("%c", &ch);
 ch = getchar();
 printf("\n");

我使用过,因为无论用户输入YN,它都会在一次迭代后终止。我以为我把ch = getchar() 吃掉\n 做错了,我删除它并在转换说明符之前放置一个空格并用" %c" 替换它也不起作用。当我用@ 替换转换说明符时987654329@ 工作正常。
这有什么问题吗?
我访问了这个post,它说的和我做的一样。

【问题讨论】:

  • 王座游戏..
  • "用scanf() 读取字符" - 不,不,从不! 为此,可以使用fgetc(stdin) 代替。事实上,如果你考虑过使用scanf(),那就不要了。
  • @Renan;是的,我没有发布问题,因为它与它无关。
  • 顺便说一句,如果您将值转换为字符 (%c),则不应在此处添加 \n\n 本身就是另一个字符,而您只获取一个字符。但是话又说回来,我的 C++ 比泰坦尼克号还生锈。
  • @H2CO3 我认为您的评论本身就是一个值得回答的问题。

标签: c char scanf specifier


【解决方案1】:
printf("Play again? ");
scanf(" %c", &char);

此代码对我有用。该项目来自 K.N.King 的“C 编程:一种现代方法”一书。我之前遇到过这个问题并且遇到了同样的问题。在第 224 页有一个guess.c 示例项目,其中包含完全相同的命令“询问”(“再次播放”)。并且作者使用了 scanf(" %c", &command); (他使用命令而不是 ch)并且它确实有效。我记得我在“掷骰子游戏”项目中使用过它,但它不起作用。可能我错过了什么。 总的来说,100% 以上的表达式确实有效。

【讨论】:

  • 是的。我正在关注同一本书。
【解决方案2】:

发布的代码具有未定义的行为,因为ch 的类型为int,并且格式说明符%c 必须与char 匹配。

当我替换转换说明符 %d 时,它工作正常。

当您切换到 %d 时,scanf() 会失败,因为 Yy 不是 int,因此不会消耗任何输入(除了前导空格会在后续迭代中丢弃换行符循环)和随后的ch = getchar() 实际上读取用户输入的字符,并且代码由侥幸工作。始终检查 scanf() 的返回值,它返回所做的分配数。

【讨论】:

  • 告诉我一件事,我读到char可以定义为int,是不是错了??
  • 另外,我同意在使用%d 时它不会读取charch = getchar() 读取输入的字符但是,为什么它不读取\n(留下)下一次迭代?
  • 没有。它无法读取 Y。因此 getchar 读取 Y,使新行未被使用。下次循环时会跳过新行,但下一个 Y 失败并且 getchar 读取它并离开新行 ...
  • 你的意思是scanf跳过了新行?
  • 感谢您的回答。你解释得很好。
【解决方案3】:
scanf("%c", &ch);
ch = getchar();

这就是您丢失存储在ch 中的前一个字符的方式。怎么样

ch = fgetc(stdin);
while (fgetc(stdin) != '\n')
    ;

改为?

【讨论】:

  • 我知道有很多可能的方法,但为什么它不能以我尝试的方式工作。你可以看到很多关于这个的帖子(也有here)说它应该可以工作。
  • @hacks 我的示例实际上是有缺陷的,而不是我的意图,请参阅修复更新。
【解决方案4】:

您用scanf() 转换字符,然后立即用getchar() 覆盖它。我不希望它起作用,除非您在输入 ENTER 之前输入“yy”,但随后您的第二次确认将失败。

顺便说一句,使用" %c"中的空间。

【讨论】:

  • 再次阅读我的问题,我试过了,但对我没有用!
  • @hacks int ch --> char ch;/* " %c" */
猜你喜欢
  • 2012-12-18
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多