gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:49:01 25 4
gpt4 key购买 nike

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

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

#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() ,它有一个大小参数。

请注意,对于 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() 功能。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com