我试图写一个程序与选择菜单使用开关语句在C.这是我的代码:
main ()
{
char option;
int test;
start:
printf ("Enter: ");
scanf ("%c", &option);
while (getchar() != '\n');
switch (option)
{
case '1':
printf ("Test 1 : ");
scanf ("%d", &test);
break;
case '2':
printf ("Test 2 : ");
break;
}
if (option != 'q') goto start;
}
该程序将重复执行,直到从键盘输入“q”字符。问题是,每当我第一次尝试从键盘输入“1”(执行案例1),下一次输入“1”或“2”时,程序将跳过案例1(或2)并直接进入下一个循环,但在下一个循环后,它会正常执行案例1(或2)。此外,案例2(没有scanf()函数)的每一项都能正常工作。我还尝试从案例1中删除scanf,之后案例1正常执行。以下是一些输出:
Enter: 1
Test 1 : 5
Enter: 1
Enter: 1
Test 1 : 7
Enter: 2
Enter: 2
Test 2 :
Enter: 2
Test 2 :
谁能给我解释一下我的代码出了什么问题,并告诉我如何修复它?
浏览你的代码:
scanf ("%c", &option);
输入1\n
(\n
是按Enter生成的换行符)。上面的scanf
消耗1
,将\n
留在标准输入流(stdin
)中。接下来,
while (getchar() != '\n');
使用\n
并中断循环(因为条件为false)。现在,
scanf ("%d", &test);
您可以键入
scanf ("%c", &option);
此
scanf
会在stdin
中看到上次调用scanf
时留下的\n
,并使用它,因此不会等待进一步的输入。这就是问题所在。
修复方法包括更改
>
这个:
scanf ("%d", &test);
到
scanf ("%d%*c", &test); /* `%*c` scans and discards a character */
这
scanf ("%c", &option);
到
scanf (" %c", &option); /* The space discards all whitespace characters, if any, until the first non-whitespace character */
等
scanf(“%d”,
使用循环,而不是goto
-
while(option!='q'){
printf ("Enter: ");
if(scanf (" %c", &option)==1){ // leave a space before %c and check return of scanf
//while (getchar() != '\n');
switch (option)
{
case '1':
printf ("Test 1 : ");
scanf ("%d", &test);
break;
case '2':
printf ("Test 2 : ");
break;
}
}
}
在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之
本文向大家介绍C语言中scanf()和gets()之间的区别,包括了C语言中scanf()和gets()之间的区别的使用技巧和注意事项,需要的朋友参考一下 在C语言中,都定义了和函数,以从外部源获取输入并将其作为输入传递给系统。现在,两个功能之间存在一些特性差异。 以下是和之间的重要区别- 序号 键 scanf()函数 gets()函数 1 定义 该方法可以从键盘读取输入,并根据给定的格式说明符将
本文向大家介绍C语言中scanf函数与空格回车的用法说明,包括了C语言中scanf函数与空格回车的用法说明的使用技巧和注意事项,需要的朋友参考一下 众所周知,C语言中的scanf函数的作用是从标准输入设备(通常是键盘)读取输入值,并存储到参数列表中指针所指向的内存单元。 下面从几个方面说一下一些稍微细节的东西。下面的实验都在vc6.0中通过。 1、scanf的返回值 scanf通常返回的是成功赋值
在 Go 代码中通过 //export Go函数名称 导出Go的函数名称 在 C 代码中通过 extern 返回值类型 Go函数名称(形参列表); 声明 Go 中导出的函数名称 注意://export Go 函数名称 和 extern 返回值类型 Go函数名称(形参列表); 不能在同一个文件中 package main import "C" import "fmt" // 导出Go函数声
我试图理解scanf和输入缓冲区之间的关系。我将scanf与以下格式字符串一起使用: 并尝试理解为什么我可以输入尽可能多的空白(输入,空白,选项卡)后,我输入一个数字,如54,并按回车键。 据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。 因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n] 现在从左到右计算s
这节课我们来学习下程序中另外一个非常重要的语句:if。 1. 语法 if (判断条件布尔运算) { 条件成立后运行的语句 } 这里的条件判断采用了布尔运算,也就是真值和假值两种情况。当 if 后面放入的条件判断语句的执行最终结果为真的时候,就会执行花括号中的语句,如果条件语句最终的结果为假,那么就不会执行花括号 中的语句,程序会跳过花括号中的代码段,继续执行后面的代码。 这里给出了真值表,以供