所以我也很新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个警告
警告:指针与整数之间的比较[默认启用]
这对我来说是一次学习经历,我将不胜感激。
答案 0 :(得分:1)
因此,第一个也是最重要的错误已经出现在评论中,但为了完整性,请在此处重复:
请勿使用gets()
!它已损坏,因此已从当前的C标准中删除。使用gets()
,您无法控制实际读取的输入量,因此任何缓冲区都可能溢出(攻击者将使用该缓冲区)。替换为fgets()
,其具有大小参数。
请注意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()
功能。