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