C 当用户输入空行时,执行一些特殊操作

C 当用户输入空行时,执行一些特殊操作,c,function,C,Function,我刚刚开始学习C。我有一个程序,可以打印菜单,让用户一步一步地选择要做什么。现在,每当用户输入空行时,我都想返回主菜单,但我如何才能做到这一点? 我想我可以做一个函数,让程序返回主菜单,但是什么时候调用这个函数呢?我知道每当我scanf做某事时,用if-else不好 我已经习惯了OO世界,所以这对我来说有点陌生,请帮助:)C语言不是OO世界,所以我想说,如果不是这样的话,请坚持。无论如何,在创建文本菜单时,通常会使用if-else的开关(用户选择) 您需要有关scanf()的帮助吗?C语言不是一

我刚刚开始学习C。我有一个程序,可以打印菜单,让用户一步一步地选择要做什么。现在,每当用户输入空行时,我都想返回主菜单,但我如何才能做到这一点?
我想我可以做一个函数,让程序返回主菜单,但是什么时候调用这个函数呢?我知道每当我
scanf
做某事时,用if-else不好


我已经习惯了OO世界,所以这对我来说有点陌生,请帮助:)

C语言不是OO世界,所以我想说,如果不是这样的话,请坚持。无论如何,在创建文本菜单时,通常会使用if-else的
开关(用户选择)


您需要有关scanf()的帮助吗?

C语言不是一个面向对象的世界,所以我想说,如果需要,请坚持使用。无论如何,在创建文本菜单时,通常会使用if-else的
开关(用户选择)


如果您正在执行以下操作,是否需要有关
scanf()
的帮助?

printf("0)     do something\n");
printf("1)     do something else\n");
printf("enter) main menu\n");
…那么scanf不是你真正的朋友

你可以这样做:

char buf[80];  
int choice;
printf(menu_text);
fgets(buf, 80, stdin);
if(strlen(buf))
{
    sscanf(buf, "%d", &choice);
    switch(choice)
    {
    case 0:
        /* etc */
        break;
    case 1:
        /* etc */
        break;
    }
}
else
{
    go_back_to_main_menu();
}

如果您正在按照以下方式进行操作:

printf("0)     do something\n");
printf("1)     do something else\n");
printf("enter) main menu\n");
…那么scanf不是你真正的朋友

你可以这样做:

char buf[80];  
int choice;
printf(menu_text);
fgets(buf, 80, stdin);
if(strlen(buf))
{
    sscanf(buf, "%d", &choice);
    switch(choice)
    {
    case 0:
        /* etc */
        break;
    case 1:
        /* etc */
        break;
    }
}
else
{
    go_back_to_main_menu();
}

这取决于用户是否通过发送字符串或单个字符/按键进行通信

如果通过字符串进行通信,请尝试从以下内容开始:

char  buffer[MAX_BUF_LEN];
char* pBuffer = buffer;
scanf("%s%*c",pBuffer);
if (strlen(pBuffer) == 0)
  goto_main_menu();
else
  process_user_input(pBuffer);
int inkey = getchar();
if (inkey == '\n')
  goto_main_menu();
else
  process_user_input(inkey);
如果通过字符/按键进行通信,请尝试从以下内容开始:

char  buffer[MAX_BUF_LEN];
char* pBuffer = buffer;
scanf("%s%*c",pBuffer);
if (strlen(pBuffer) == 0)
  goto_main_menu();
else
  process_user_input(pBuffer);
int inkey = getchar();
if (inkey == '\n')
  goto_main_menu();
else
  process_user_input(inkey);

scanf
之后使用“if/else”是完全有效的。用户发送的任何内容在使用前都应经过检查和验证。

这取决于用户是否通过发送字符串或单个字符/按键进行通信

如果通过字符串进行通信,请尝试从以下内容开始:

char  buffer[MAX_BUF_LEN];
char* pBuffer = buffer;
scanf("%s%*c",pBuffer);
if (strlen(pBuffer) == 0)
  goto_main_menu();
else
  process_user_input(pBuffer);
int inkey = getchar();
if (inkey == '\n')
  goto_main_menu();
else
  process_user_input(inkey);
如果通过字符/按键进行通信,请尝试从以下内容开始:

char  buffer[MAX_BUF_LEN];
char* pBuffer = buffer;
scanf("%s%*c",pBuffer);
if (strlen(pBuffer) == 0)
  goto_main_menu();
else
  process_user_input(pBuffer);
int inkey = getchar();
if (inkey == '\n')
  goto_main_menu();
else
  process_user_input(inkey);


scanf
之后使用“if/else”是完全有效的。用户发送的任何内容在使用前都应进行检查和验证。

我猜您使用的是switch语句来过滤输入,所以只需选择“\n”或换行符即可输出打印菜单。

我猜您使用的是switch语句来过滤输入,因此,只需为“\n”或换行符设置一个选项,即可将打印输出到菜单。

在OO世界中如何执行?在OO世界中如何执行?您好,我尝试了这段代码,但不起作用。它没有转到另一个函数,而是将光标放在新行中,但仍然接受输入哪段代码不起作用?如果第一个无法工作,请尝试第二个,并在调用
getchar
后添加一行,该行将按键的十六进制值记录到一个文件中(以便您可以看到您的程序作为输入接收的确切内容)。我对这两个都进行了测试,但在我按Enter键后,它们不会执行任何操作。正确的行为应该是在goto_主菜单()中执行任何操作,对吗?控件仅在我输入某些内容(即不是空行)后才移动。@phunehehe:正确。如果输入字符是换行符,
goto_main_menu()
应运行。如果当您点击enter键时,
getchar
没有返回,那么您的终端可能正在缓冲您的输入(并且仅在您输入内容后才将其传递给您的应用程序)。您可能希望尝试将您正在使用的任何终端设置为无缓冲输入,并查看您的行为是否发生变化。但是,执行此操作的代码是特定于平台的。你目前运行的是什么平台?哦,真的是平台特定的吗?那太糟糕了。。。我正在使用slackware,代码将上载到运行redhat的服务器,并可通过putty访问:(您好,我尝试了这段代码,但它不起作用。它没有转到另一个函数,而是将光标放在新行中,但仍然接受输入哪段代码不起作用?如果第一段代码不能起作用,请尝试第二段代码,并在调用
getchar
后添加一行,将按键的十六进制值记录为f。)ile(因此您可以看到您的程序接收到的输入内容)。我使用这两个选项进行了测试,在我按Enter键后,它们不会执行任何操作。正确的行为是在goto_main_menu()中执行任何操作,对吗?控件仅在我输入某些内容(即不是空行)后才移动…@phunehehe:正确。如果输入字符是换行符,
goto_main_menu()
应该运行。如果当您点击enter键时,
getchar
没有返回,则您的终端可能正在缓冲您的输入(并且只有在您输入某些内容后才将其传递到应用程序)。您可能想尝试设置您正在使用的任何终端以取消缓冲输入,并查看您的行为是否发生变化。但是,执行此操作的代码是特定于平台的。您当前运行的是哪个平台?哦,真的是特定于平台吗?这非常糟糕……我正在使用slackware,代码将上载到运行r的服务器edhat,它可以通过putty访问:(感谢代码示例,但这并不是我真正需要的。假设我在子函数中(即已经在开关中),如果我检测到空行输入,我想出去……那么您可能正在执行类似开关的操作(选项[0]){case'0':call_func_1;break;case'1':call_func_2;break;}?如果是这种情况,您可以从数组中的第0个条目是'\0':switch(选项[0]){case'\0':返回到_main_menu();}这一事实中得到一些启发。感谢代码示例,但这并不是我真正需要的。假设我在子函数中(即已经在开关内部),我想出去,以防我检测到空行输入……然后您可能正在执行类似于开关的操作(选项[0]){case“0”:call_func_1;break;case“1”:call_func_2;break;}?如果是这种情况,您可以从数组中的第0个条目是“\0”:switch(选项