2012-12-20 42 views
1

我有这个功能,它是一个菜单。编译后,以下错误不断显示:错误:指针和整数之间的比较[缺省情况下启用]。为什么发生这种情况?菜单功能错误:指针和整数之间的比较[默认启用]

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"); 

谢谢!

+0

顺便说一句,你为什么不阅读你尝试使用的函数的文档? – 2012-12-20 20:49:56

回答

0

这条线:

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

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

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

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

不能使用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; 
} 

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

祝你好运!

0

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

#include <unistd.h> 

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

希望这会有所帮助。

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

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

+0

您是否回答了这个错误的问题? – Blastfurnace

相关问题