我正在使用code :: blocks进行编程,而我在这里遇到的问题就是代码:
char fileName[] ="";
fflush(stdin);
E11: printf("\n\tEnter the @ Mac (X:X:X:X:X:X) in Hex :");
gets(MAC);
E12: printf("\n\tEnter file name:");
gets(fileName);
FILE* fichier;
fichier = fopen(fileName,"r");
if (fichier == NULL)
{
printf("Error! Try Again");
goto E12;
}
else
{
printf("sending Data....");
//TODO..
}
答案 0 :(得分:3)
首先,不要使用gets()
,而是使用fgets()
。
gets()
严重受到缓冲区溢出问题的影响,使用fgets()
可以避免这种情况。
也就是说,通过说
来解决代码中的 main 问题char fileName[] ="";
你正在分配一个1-char数组,但这还不足以保存输入。
您应该将其更改为
char fileName[64] = {0};
或类似的东西。
此外,fflush(stdin);
违反了C
标准,它会调用undefined behavior。删除该声明。
答案 1 :(得分:0)
此程序显示未定义的行为。 filename
是一个char
数组,只有一个元素。尝试将声明更改为char fileName[256] = "";
答案 2 :(得分:0)
fflush(stdin)
is undefined behavior. gets
很糟糕。来自man gets
:
永远不要使用
gets()
。因为不知道这是不可能的 数据预先将读取多少个字符gets()
,因为gets()
将继续将字符存储在缓冲区的末尾 使用极其危险。它已被用来破坏计算机 安全。 使用fgets()
代替。
(强调和代码格式化程序已添加。)
定义
char fileName[] = "";
仅分配一个字节的内存,因为sizeof("") == 1
。您需要一种更灵活的方法,这是fgets
的另一个参数。只需分配一些可能存储整个输入的任意数量的字节,并将该大小传递给fgets
:
char fileName[32];
...
fgets(fileName, sizeof(fileName), stdin);
答案 3 :(得分:0)
尝试并尝试后如果发现问题是我试图读取的文件是我从here复制的 lorem ipsum 。 我不能相信它,它太奇怪了。
感谢您的回答。