使用fscanf时防止缓冲区溢出

时间:2013-09-17 08:47:33

标签: c++ input buffer-overflow scanf

我正在使用fscanf从CSV文件中读取一些值,我想确保读入值的数据不会太大并导致缓冲区溢出。

我的csv文件的格式为int,string,string,我要读的代码如下(我稍后会修复while条件):

while(fscanf(f, "%d,%[^,],%[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/

使用scanf时,我会指定长度,以防止溢出:scanf("%20f", example);

但如果我尝试上述内容:while(fscanf(f, "%d,%20[^,],%10[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/

代码执行时出现崩溃。

3 个答案:

答案 0 :(得分:3)

尝试fscanf_s,此功能具有安全性增强功能。 http://msdn.microsoft.com/en-us/library/6ybhk9kc(v=vs.90).aspx

答案 1 :(得分:2)

阅读字符时,你不能用fprintf做到这一点。

我会首先读取整行,例如,使用getline(),找到分隔符(或标记行),然后解析各个元素。

顺便说一下,你崩溃的原因也可能是inArray的错误定义/初始化。

答案 2 :(得分:0)

OP可能在fscanf()中使用了错误的宽度。

虽然OP没有发布关于inArray[i]的详细信息,但我们假设它是

struct {
  int ID;
  char label[20];
  char brand[10];
} inArray[100];

格式应为

"%d,%19[^,],%9[^,]"

19的宽度需要比目的地的大小小1,因此允许'\ 0'的位置。