菜单功能错误:指针和整数之间的比较[默认启用]

时间:2012-12-20 20:43:30

标签: c eclipse-cdt

我有这个功能,这是一个菜单。编译后,以下错误不断出现:错误:指针和整数之间的比较[默认情况下启用]。为什么会这样?

    char choice;

    printf ("Welcome to the Customer menu! \n");
    printf ("Please select option from below\n");
    printf ("a. Add customer\n");
    printf ("b. Modify customer\n");
    printf ("c. List customers\n");
    printf ("d. Go back to main menu");

    while ((gets(&choice)) != 'q')
            {
                if (choice == '\n')
                    continue;
                switch (choice)
                {

        case 'a' : add_customer();
                   break;
        case 'b' : printf ("products_main ()");
                   break;
        case 'c' : printf ("orders_main ()");
                   break;
        default : printf ("Invalid input. Please enter an option from the above menu\n");
                  continue;

                }

                printf ("END PROGRAM");

谢谢!

4 个答案:

答案 0 :(得分:1)

gets()函数返回char *,而您将该返回值与char进行比较:

if (gets(&choice)) != 'q')

另请注意,这是两个级别的错误,因为gets()stdin读取,直到遇到换行符,因此如果您将char的地址传递给它,则很可能导致缓冲区溢出错误。为什么不使用fgets()

char buf[128];
fgets(buf, sizeof(buf), stdin);
if (buf[0] == 'q') {
    /* etc */
}

答案 1 :(得分:1)

您不能使用gets()来执行此操作,而afterall gets()非常危险,不会检查要读取多少字符,因此会导致运行时缓冲区溢出非常糟糕。

你应该像H2CO3一样使用fgets(),它有一个读取字符的限制,所以更安全。

char * input(const char *message, size_t quantity)
{
    const int BUFFER_SIZE = 512;
    char buf[BUFFER_SIZE], *res = NULL;

    if(quantity > BUFFER_SIZE || quantity == 0)
        quantity = BUFFER_SIZE - 1;

    if(message) 
        printf("%s",message);

   if(fgets(buf, quantity + 1, stdin) > 0)
   {
        char *end = strchr(buf, '\n');
        if(end){
            *end = '\0';
        }

        res = malloc(strlen(buf) + 1);
        if(!res)
        {
           fprintf(stderr, "input(): MEM alloc error\n");
           return NULL;
        }
       strcpy(res, buf);

   }
   return res;
}

尝试使用该功能,只需传递您想要的信息,以及您想要的输入字符的确切数量。 :)

如果你想单独试试,你可以在这里找到一个测试程序:

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

char * input(const char *message, size_t quantity)
{
    const int BUFFER_SIZE = 512;
    char buf[BUFFER_SIZE], *res = NULL;

    if(quantity > BUFFER_SIZE || quantity == 0)
        quantity = BUFFER_SIZE - 1;

    if(message) 
        printf("%s",message);

   if(fgets(buf, quantity + 1, stdin) > 0)
   {
        char *end = strchr(buf, '\n');
        if(end){
            *end = '\0';
        }

        res = malloc(strlen(buf) + 1);
        if(!res)
        {
           fprintf(stderr, "input(): MEM alloc error\n");
           return NULL;
        }
       strcpy(res, buf);
   }
   return res;
}

int main()
{
    char *a = input("Input:", 4);
    if(a) 
    {
        printf("%s\n",a);   
        free(a);   
        return 0;
    }
    printf("Got NULL input\n");
    return -1;
}

如果您对某个特定功能有疑问,他们的论点是什么,它们的返回值是什么,您可以在Google中查找它,您会发现很多示例和函数定义。随着时间的推移,您将学会轻松理解定义并记住一些函数名称及其参数。

祝你好运!

答案 2 :(得分:0)

这一行:

while ((gets(&choice)) != 'q')

gets()读取一个字符串,而不是一个char,并返回该字符串(即它填充您通过char指针传递给它的缓冲区)。然后,将返回的指针(与传入的指针相同)与char进行比较。

您可能只想阅读一个字符。如果你想要一个完整的字符串,你需要将它读入一个char数组,而不是传递一个字符的地址。

答案 3 :(得分:0)

在做了一些阅读后,我发现包括

#include <unistd.h>

有助于获得警告。我是unix c的新手,我以前从未见过它。我还在测试我的代码,所以当我弄清楚这是否有效时,我会回复你。

希望这会有所帮助。

最后警告又回来了,最后进入无限循环,所以我的逻辑出了问题。

抱歉,我没有任何帮助。