C 成功完成第一个任务后,基本菜单驱动的程序重复两次

C 成功完成第一个任务后,基本菜单驱动的程序重复两次,c,C,我用柏拉图3写C程序 我正在创建一个菜单驱动的程序,但想测试一下让它工作的基本概念 #include<stdio.h> #include<ctype.h> int function1(); main(){ char s; do{ puts("\n choose the following"); puts("(P)rint\n"); puts("(Q)uit\n"); scanf("%c",&s); s=toupper(s);

我用柏拉图3写C程序

我正在创建一个菜单驱动的程序,但想测试一下让它工作的基本概念

#include<stdio.h>
#include<ctype.h>
int function1();

main(){
  char s;
 do{
   puts("\n choose the following");
   puts("(P)rint\n");
    puts("(Q)uit\n");
   scanf("%c",&s);
   s=toupper(s);
   switch (s){
     case 'P' : function1();
        break;
        case 'Q' : return -1;
     break;
    }
 }while (function1()==0);  
}

int function1(){
   printf("Hello World");
   return 0;
 }
-知道为什么吗


请帮忙,谢谢

如果选择p,则在该case语句中调用function1。然后,由于您还没有从main返回-1,这是循环可以退出的唯一方法,因此您将再次从循环条件中调用function1

它在双HelloWorld和单HelloWorld之间交替使用的原因是空格字符与“p”不匹配。相反,他们只是被忽视了。要处理此问题,您可能希望放弃空白,因此我们将\n添加到。我还为不正确的输入添加了一个默认情况,该情况目前也会退出循环。所以你最终会得到这样的结果:

main(){
    char s;
    int status = 0;
    do{
        puts("\n choose the following");
        puts("(P)rint\n");
        puts("(Q)uit\n");
        scanf("\n%c",&s);
        s=toupper(s);
        switch (s){
        case 'P' : status = function1();
            break;
        case 'Q' : status = -1;
            break;
        default : status = -1;
        }
    } while (status == 0);
}

如果选择p,则在该case语句中调用function1。然后,由于您还没有从main返回-1,这是循环可以退出的唯一方法,因此您将再次从循环条件中调用function1

它在双HelloWorld和单HelloWorld之间交替使用的原因是空格字符与“p”不匹配。相反,他们只是被忽视了。要处理此问题,您可能希望放弃空白,因此我们将\n添加到。我还为不正确的输入添加了一个默认情况,该情况目前也会退出循环。所以你最终会得到这样的结果:

main(){
    char s;
    int status = 0;
    do{
        puts("\n choose the following");
        puts("(P)rint\n");
        puts("(Q)uit\n");
        scanf("\n%c",&s);
        s=toupper(s);
        switch (s){
        case 'P' : status = function1();
            break;
        case 'Q' : status = -1;
            break;
        default : status = -1;
        }
    } while (status == 0);
}

非常感谢马修!!!!这个int status=0非常聪明,谢谢!我没想到。哦,我想补充一点,使用\n%c还两次停止了Hello World的回音。。谢谢你能解释一下空白现象吗?非常感谢您的帮助,非常感谢!基本上,当您键入p并按enter键时,程序会将其读取为两个字符“p”和“\n”,我相信Windows上有三个字符“p”、“r”和“\n”。如果scanf格式字符串中没有空格,程序将尝试将空格作为单独的命令处理。非常感谢Matthew!!!!这个int status=0非常聪明,谢谢!我没想到。哦,我想补充一点,使用\n%c还两次停止了Hello World的回音。。谢谢你能解释一下空白现象吗?非常感谢您的帮助,非常感谢!基本上,当您键入p并按enter键时,程序会将其读取为两个字符“p”和“\n”,我相信Windows上有三个字符“p”、“r”和“\n”。如果scanf格式字符串中没有空格,程序将尝试将空格作为单独的命令处理。