把我的输入和一个while循环比较,fgets?

时间:2012-08-23 01:40:34

标签: c loops comparison while-loop fgets

编辑:我必须添加一个getchar(); scanf之后(“%i”,& choice);现在它只问了一次!

显然它的案例开关导致它输出两次。如果我在外壳开关外调用该功能,则输出1,但如果我在开关内调用它,则输出两次

造成这种情况的原因是什么?我怀疑是scanf的选择吗?

    #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>

        void test();
        void choose();
        int main(void)
        {   
//if i call here its fine
            test();
            choose();
            return 0; 
        }

        void choose()
        {
            int choice;

            do
            {
                printf("1 - Testing if double ask\n");
                printf("2 - Exit\n");
                printf("Please enter your choice: ");       
                scanf("%i", &choice);

                switch(choice)
                {//but pressing 1 here asks twice?
                    case 1:         
                        test();
                        break;
                    default:
                        if(choice !=2)
                            printf("Input Not Recognized!\n");
                        break;          
                }
            }
            while(choice !=2);
            if(choice == 2)
                printf("Ciao!");
        }
        void test()
        {
printf("HELLO");
                char *name = malloc (256);

                do      
                {
                    printf("Would you like to continue (y/n)\n");
                    fgets(name, 256, stdin);
                }
                while(strncmp(name, "n", 1) != 0);
                free (name);
        }

2 个答案:

答案 0 :(得分:4)

首先:您无法将C字符串与比较运算符!===进行比较。您需要使用strcmp

此外,我认为在这种情况下你会发现do { ... } while循环更有用。在用户有机会添加任何输入之前,您需要检查一次name

接下来需要注意的是fgets会在您的输入中保留换行符,因此您需要在strcmp的使用中解决此问题。

答案 1 :(得分:1)

字符串比较不像C中那样,你必须在string.h中使用strcmp。

或者你可以看一下名字中的第一个字符。

while(name[0] != 'n')