Предотвращение переполнения буфера при использовании fscanf

Я использую 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*/

Я получаю сбой, когда код выполняется.

0

Решение

Пытаться fscanf_sэта функция имеет улучшения безопасности.
http://msdn.microsoft.com/en-us/library/6ybhk9kc(v=vs.90).aspx

3

Другие решения

Вы не можете сделать это с помощью fprintf при чтении символов.

Сначала я прочитал бы всю строку, например, с getline()найдите разделители (или токенизируйте строку), а затем проанализируйте отдельные элементы.

Кстати, причиной вашего сбоя также может быть неправильное определение / инициализация inArray,

2

ОП, вероятно, использовал неправильную ширину в fscanf(),

Хотя ОП не публиковал подробности о inArray[i] давайте предположим, что это было

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

Формат должен быть

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

Ширина 19 должна быть на 1 меньше, чем размер пункта назначения, таким образом, оставляя место для ‘\ 0’.

0