繁体   English   中英

电话目录程序的“指针与整数之间的比较”错误

[英]'comparison between pointer and integer' error for Phone Directory program

所以我也很新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)
{

您在这里有两个错误:

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

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

char str[256];

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM