所以我也很新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;
}


该程序的问题是当我编译并生成程序时,它会打印脚本的“选择”部分,其中使用了get(str)。选择了我也想使用的脚本后,它变为空白,没有任何显示,但脚本本身仍在运行。

我也真的很新,我假设它与if / else语句中确定哪个部门的选择也有关系。我似乎无法弄清楚我在做什么错。我尝试了不同的解决方案,通常会得到不同的结果,最接近的解决方案是在运行脚本的else if语句的最后一行加上分号,该脚本运行脚本,跳过前两个else语句,并输出安全代码。

第10、16和22行弹出3条警告

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

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

最佳答案

因此,第一个也是最重要的错误已在注释中,但为了完整起见,在此重复此错误:

不要使用gets()!它已损坏,因此已从当前的C标准中删除。使用gets(),您无法控制实际读取了多少输入,因此任何缓冲区都可能溢出(攻击者将使用该缓冲区)。替换为fgets(),它具有一个size参数。

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

返回您的代码,假设您像这样使用fgets()

char str[20];

fgets(str, 20, stdin);

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


您在这里有两个错误:


您拨打fgets()两次。每个调用将尝试读取一行输入并将其存储在str中。那不是你想要的。
fgets()不返回长度,但返回str的指针(如果成功)。如果失败,则返回NULL


因此,代码应该像这样开始:

char str[256];

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


仅在进行错误检查之后,才应检查str的内容,即用户实际输入的内容。

注意我也增加了缓冲区大小。人们可能会无意间输入更长的行,而如今确实不需要紧缩字节。

最后,仅检查长度可能不是一个好主意。而是包含string.h并使用strcmp()函数。

关于c - 电话目录程序的“指针与整数之间的比较”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50073639/

10-11 21:59
查看更多