Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf()读取字符_C_Char_Scanf_Specifier - Fatal编程技术网

使用scanf()读取字符

使用scanf()读取字符,c,char,scanf,specifier,C,Char,Scanf,Specifier,此代码用于掷骰子游戏 #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));

此代码用于掷骰子游戏

#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;
   }                    
}
我使用了,因为无论用户输入什么
Y
N
,它都会在一次迭代后终止。我认为我放了
ch=getchar()
来消耗
\n
是做错了,我把它去掉,在转换说明符之前放了一个空格,然后用
%c
替换了它,它也不起作用。当我用
%d
替换转换说明符时,它工作得很好。
这有什么问题吗?
我访问了这个网站,它说的和我做的一样

scanf("%c", &ch);
ch = getchar();
这就是为什么您丢失了存储在
ch
中的前一个字符。怎么样

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

相反?

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


顺便说一句,使用
%c”
中的空格发布的代码具有未定义的行为,因为
ch
类型为
int
,格式说明符
%c
必须匹配
char

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

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

printf("Play again? ");
scanf(" %c", &char);
这个代码对我有用。该项目来自K.N.King的《C编程:现代方法》一书。我以前遇到过这个问题,也遇到过同样的问题。在第224页有一个guess.c示例项目,其中包含完全相同的命令“ask”(“play reach”)。作者使用了scanf(“%c”和&command);(他用命令代替了ch)它确实起了作用。我记得我在“垃圾游戏”项目中使用过它,但它不起作用。也许我错过了什么。
总的来说,100%以上的表达确实有效。

王座游戏。“使用
scanf()阅读角色”
“-不,不,永远不会!为此,可以使用
fgetc(stdin)
。事实上,如果你考虑使用<代码> ScSff()/<代码>,那么就不要这样。@ Renan;是的,我没有发布问题,因为它与此无关。顺便说一句,如果您要在字符(
%c
)中添加一个值,那么它不应该在那里添加
\n
<代码>\n本身是另一个字符,您只能获取一个字符。但是,我的C++比泰坦尼克号更生锈。我认为你的评论本身就是一个值得回答的问题。我知道有很多可能的方法,但是为什么我不尝试这样做。你可以看到很多关于这一点的帖子,并且(也)说它应该有效。@haccks我的例子实际上是有缺陷的,并不是我想要的,请参阅修复更新。再次阅读我的问题,我尝试了它,但它对我无效@haccks
int ch
-->
char ch;/*%c“*/
告诉我一件事,我读到
char
可以定义为
int
,这是错误的吗?而且,我同意在使用
%d
时,它不会读取
char
,并且
ch=getchar()
读取输入的字符,但是,为什么它不读取
\n
(留守)在下一次迭代中?否。它无法读取Y。因此getchar读取Y,而新行未被使用。下一次循环时,将跳过新行,但下一个Y将失败,getchar将从新行中读取它…您的意思是说新行被
scanf
跳过?谢谢您的回答。你解释得很好。我在看同一本书。
printf("Play again? ");
scanf(" %c", &char);