1

我有这个功能,它是一个菜单。编译后不断出现如下错误:error: comparison between pointer and integer [默认开启]。为什么会这样?

    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

4 回答 4

2

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

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

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

char buf[128];
fgets(buf, sizeof(buf), stdin);
if (buf[0] == 'q') {
    /* etc */
}
于 2012-12-20T20:48:36.610 回答
1

您不能使用gets() 来执行此操作,毕竟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;
}

当你对一个特定的函数有疑问时,它们的参数是什么,它们的返回值是什么,你可以在谷歌中查找它,你会发现很多例子和函数定义。随着时间的推移,您将学会轻松理解定义并记住一些函数名称及其参数。

祝你好运!

于 2012-12-20T23:27:00.720 回答
0

这一行:

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

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

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

于 2012-12-20T20:46:45.877 回答
0

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

#include <unistd.h>

有助于摆脱警告。我是 unix c 的新手,以前从未见过。我还在测试我的代码,所以当我确定这是否有效时,我会回复你。

希望这可以帮助。

最后警告回来了,它最终进入了一个无限循环,所以我的逻辑有问题。

对不起,我没有任何帮助。

于 2013-10-26T20:03:33.710 回答