我有这个功能,这是一个菜单。编译后,以下错误不断出现:错误:指针和整数之间的比较[默认情况下启用]。为什么会这样?
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 :(得分: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的新手,我以前从未见过它。我还在测试我的代码,所以当我弄清楚这是否有效时,我会回复你。
希望这会有所帮助。
最后警告又回来了,最后进入无限循环,所以我的逻辑出了问题。
抱歉,我没有任何帮助。