'指针和整数之间的比较'电话目录程序出错

时间:2018-04-28 06:33:32

标签: c

所以我也很新C和编程。我一点一点地学习。我的一个朋友给了我一个关于第一个项目的好主意。目标是允许用户也选择一个部门(赌场的电话目录),一旦选择了该部门,它将显示该部门的所有号码。

最终我想要添加更多,但是现在,我也要保持简单。

#include <stdio.h>
main()
{
   printf("Please Select Department [Security, Food & Beverage, Hotel]\n");

   char str[20];

   gets(str);

   if (gets(str) == 8)
   {
       printf("You have selected Security\n");
       printf("218-760-1122, 218-760-5564\n");
   }

   else if (gets(str) == 5)
   {
       printf("You have Selected Hotel\n");
       printf("218-443-9810");
   }

   else if (gets(str) == 15)
   {
       printf("You have selected Security\n");
       printf("218-550-9818, 218-443-1231\n");
   }

   return 0;
}

这个程序的问题是当我编译和构建程序时,它会打印&#34;选择&#34;脚本的一部分,使用get(str)。在我选择了我想要使用的那个之后,它变为空白,并且没有显示任何内容,但脚本本身仍在运行。

我也非常新闻,并且我在if / else语句中假设我如何确定选择了哪个部门。我似乎无法弄清楚我做错了什么。我尝试了不同的解决方案,通常得到不同的结果,最接近的是通过添加分号,else if语句的最后一行,运行脚本,跳过前两个else语句,并打印安全代码

第10,16和22行会弹出3个警告

警告:指针与整数之间的比较[默认启用]

这对我来说是一次学习经历,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

因此,第一个也是最重要的错误已经出现在评论中,但为了完整性,请在此处重复:

请勿使用gets()它已损坏,因此已从当前的C标准中删除。使用gets(),您无法控制实际读取的输入量,因此任何缓冲区都可能溢出(攻击者将使用该缓冲区)。替换为fgets(),其具有大小参数。

请注意scanf("%s", ...)之类的内容。如果您需要使用scanf系列函数转换为字符串,请务必阅读文档,它会告诉您如何使用字段宽度

回到你的代码,假设你应该使用fgets()

char str[20];

fgets(str, 20, stdin);

if (fgets(str, 20, stdin) == 8)
{

这里有两个错误:

  1. 您拨打fgets()两次。每次调用都会尝试读取一行输入并将其存储在str中。那不是你想要的。
  2. fgets()不会返回长度,而是指向str 的指针(如果成功)。如果失败,则返回NULL
  3. 所以,代码应该像这样开始:

    char str[256];
    
    if (!fgets(str, 256, stdin))
    {
        fputs("Error reading input.", stderr);
        return 1;
    }
    

    只有在错误检查之后,您才应检查str内容,即用户实际输入的内容。

    注意我也增加了缓冲区大小。人们可能偶然输入更长的线路,现在真的没有必要紧跟字节。

    最后,只是检查长度可能不是一个好主意。相反,请添加string.h并使用strcmp()功能。