Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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会让我的switch语句发疯?_C_String_Scanf - Fatal编程技术网

为什么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 ) {}