【发布时间】:2016-12-22 15:14:30
【问题描述】:
我试图编写一个代码来使用而不是使用 goto,我写了这个。 当我让这段代码运行时:
int main()
{
int a;
printf ("1 or 2");
scanf ("%d", &a);
if (a == 1)
{
return card();
}
else
return computer();
}
int computer(void)
{
char c;
int f = 0 ;
do
{
printf ("choose y or n\n");
scanf ("%c", &c);
switch (c)
{
case 'y':
card();
break;
case 'n':
main();
break;
}
}
while(f<1);
return 0;
}
int card(void)
{
char d;
int e = 1;
do
{
printf ("chhose y or n2\n");
scanf ("%c", &d);
switch (d)
{
case 'y':
computer();
break;
case 'n':
main();
break;
}
}
while(e<2);
return 0;
}
它的输出是这样的:
1 or 2 2
choose y or n
choose y or n
第二次打印相同的东西。我尝试为不同的样式或算法更改 while 循环,但找不到有用的解决方案。我真的是编码新手,所以我真的没有想法
【问题讨论】:
-
递归调用
main通常不是一个好主意。在main函数中有一个主循环要好得多。 -
至于你的问题。当您输入时,您使用回车键结束输入。此键作为换行符 (
'\n') 存储在输入缓冲区中,当您在读取数字后读取字符时,您将获得此换行符。在"%c"之前的格式字符串中添加一个空格以丢弃换行符。 -
在
card中调用main,从main调用是一个隐藏的递归——小心,不要那样做。从main调用的函数应该使用return返回main -
do while 循环
while(f<1);将无限运行,因为您没有递增f -
一般注意事项:如果您希望用户回答单个问题并按回车,那么您应该阅读一行(如果您只能使用 C 标准库,则使用
fgets,或者更好 @ 987654336@ 如果它在您的操作系统中可用),然后解析它(可能使用sscanf,或者只是在for循环中检查它)。scanf不适合基于行的输入。
标签: c while-loop do-while