为什么scanf会让我的switch语句发疯?
如果我在为什么scanf会让我的switch语句发疯?,c,string,scanf,C,String,Scanf,如果我在case语句中调用scanf(),我似乎无法理解为什么我的程序不能工作 在我调用scanf()之前,一切正常。这是一个非常小的基于控制台的菜单。它读取刚刚输入的字符串,并相应地进入菜单。在我尝试使用它应该响应的整数scanf()之前,一切都很正常 我首先认为返回一个值会破坏Switch语句。。。然后这不起作用,所以我放置了break语句以防万一。但它仍然不起作用。只要scanf()没有被注释,整个序列就乱七八糟了 void main(void) { char MenuS; Men
case
语句中调用scanf()
,我似乎无法理解为什么我的程序不能工作
在我调用scanf()
之前,一切正常。这是一个非常小的基于控制台的菜单。它读取刚刚输入的字符串,并相应地进入菜单。在我尝试使用它应该响应的整数scanf()
之前,一切都很正常
我首先认为返回一个值会破坏Switch语句。。。然后这不起作用,所以我放置了break
语句以防万一。但它仍然不起作用。只要scanf()
没有被注释,整个序列就乱七八糟了
void main(void) {
char MenuS;
MenuS = 's';
while (MenuS != 'q') {
MenuS = Menu();
}
}
char Menu() {
unsigned char Menu;
unsigned char UserInput[9];
unsigned int Offset;
Offset = 0;
printf("\nEnt:");
gets(UserInput);
trim(UserInput);
if (UserInput[0] != 'q') {
switch (UserInput[0]) {
case 'r':
scanf("%d", &Offset);
printf("\nIn R");
return ('r');
break;
case 'w':
// printf("Is w");
printf("\nIn W");
return ('w');
break;
default:
printf("\nSomething else");
break;
}
} else {
return 'q';
}
}
我认为您遇到了一个问题,因为您声明了一个无符号int变量,但在这里使用了错误的格式说明符:
scanf("%d", &Offset);
偏移量是一个无符号整数变量
您必须对无符号整数使用%u
,而不是%d
尝试此操作,这可能会解决问题:
scanf("%u", &Offset);
学习在编译器中启用所有警告和调试信息。使用
gcc-Wall-g进行编译
然后使用调试器(例如gdb
)逐步运行程序
最后,阅读您正在使用的函数的文档。被记录为返回一个整数:
因此,您可能应该编写代码
if (scanf("%d", &Offset)<1) { perror("scanf failed"); exit (EXIT_FAILURE); };
或者至少显式调用fflush(NULL)代码>在它们之后,阅读
请记住这一点
最后,被弃用,并且危险,使用或优选。所以至少替换get(UserInput)代码>带有
memset (UserInput, 0, sizeof(UserInput));
if (NULL == fgets(UserInput, sizeof(UserInput), stdin))
{ perror("fgets"); exit(EXIT_FAILURE); }
顺便说一句,您的main
函数声明不正确。它应该是intmain(intargc,char**argv)代码>最好。它不应返回void
,而应返回EXIT\u SUCCESS
,即成功时返回0,失败时返回其他内容。另请参见EXIT_SUCCESS
和EXIT_FAILURE
和
注意:您在程序开始时缺少几个#include
指令,至少:
#include <stdio.h>
#include <stdlib.h>
#包括
#包括
我想你的代码有它们,但你没有给我们看
注:在变量中使用大写字母在C语言中是不常见的
为宏保留大写字母。但这是一个惯例
当我从交换机内部调用ScanF时,它似乎忽略了返回和中断,而只是默认值,只打印“notsomething”
如果它“忽略了返回
和中断
”,那么您将陷入案例“w”
。但事实并非如此。因此,它不会忽略返回和中断(无论如何,这是不可能的)
实际上,程序流的工作方式与您编写的一样。顺序是:
scanf(“%d”、&Offset)代码>
- 您可以键入一些数字,然后按enter键
return('r')代码>
- 返回主菜单:
MenuS=Menu()代码>-菜单
现在是'r'
while(MenuS!=“q”){MenuS=Menu();
-再次调用菜单
代码>获取(USER输入);< /代码> -获取您早前输入的空白字符串
if(UserInput[0]!='q')
-true,因为UserInput[0]
是0
,是空白字符串的字符串结束标记
开关(UserInput[0]){
没有案例0
,因此输入了默认值:
printf(“\n其他内容”);
要解决此问题:您需要放弃键入数字后按下的Enter键。一种方法是将此代码直接放在scanf
后面:
int c;
while ( (c = getchar()) != '\n' && c != EOF ) {}
请注意,您的代码还有很多其他问题,但这是主要问题。您所说的“不工作”是什么意思?代码应该做什么,实际发生了什么?您的输入是什么?我的输入将是“r”或“w”…稍后会添加更多!然后根据选项,它应该要求输入一个数字Hench->Scanf()。之后,它将调用一个带有整数的函数并返回一个值。我的意思是,当我从开关中调用ScanF时,它似乎忽略了返回和中断,而只是默认显示“Not Something”…因此,您的scanf不接受任何输入?在哪个操作系统上,使用哪个编译器-以及使用哪个编译标志-您正在开发您的程序?1)避免将scanf(“%d”,…
与get()
混合使用,因为第一个将'\n'
保留在IO缓冲区中,第二个不使用get())
,但是fgets()
。不幸的是,它仍然做同样的事情:(@BaddaBoompshhh-Hmm,可能是因为您同时使用return语句和break语句,请尝试删除break语句。@BaddaBoompshhh哦,我可以问一下,为什么默认情况下break语句的末尾有双引号?break;;
实际上没有的break语句。我后来在中使用了它们希望找到解决方案。刚才看到了双重含义:是的,对不起,我没有添加所有内容。你的解释说得很好,只是教了我分配东西:)!谢谢分配!我如何使用fgets()但是对于用户输入?谢谢你。我知道代码不可能完全失败,但在输出上确实是这样。当然这是对所有事情的有效解释。谢谢!
memset (UserInput, 0, sizeof(UserInput));
if (NULL == fgets(UserInput, sizeof(UserInput), stdin))
{ perror("fgets"); exit(EXIT_FAILURE); }
#include <stdio.h>
#include <stdlib.h>
int c;
while ( (c = getchar()) != '\n' && c != EOF ) {}