Экономьте время. Включить все предупреждения компилятора.
предупреждение: формат "% d" ожидает аргумент типа "int *", но аргумент 3 имеет тип "int" [-Wformat =]
Спецификатор *printf
"%d"
ожидает совпадения int
. Но это не printf()
.
Спецификатор *scanf
"%d"
ожидает совпадения int *
, а не int
.
// fscanf(BLZ1, "%d;%50[^\n]\n", Bank[i].banknumber, Bank[i].bankname);
fscanf(BLZ1, "%d;%49[^\n]\n", &Bank[i].banknumber, Bank[i].bankname);
// Add & here -------------^
Также: используйте 49, чтобы ограничить сканирование до 49 символов, позволяя сохранить эти 49 и нулевой символ в char bankname[50];
@ David C. Rankin
Дополнительные проблемы:
Лучший код будет проверять возвращаемое значение из fscanf()
, чем использовать feof()
.
// while (!feof(BLZ1)){
while (fscanf(BLZ1, "%d;%49[^\n]\n" , &Bank[i].banknumber , Bank[i].bankname) == 2) {
printf("%d , %s\n" , Bank[i].banknumber , Bank[i].bankname);
i++;
if (i >= size){
size +=10;
Bank = realloc(Bank , sizeof(Bankdata)*size);
}
}
Финальный "\n"
в "%d;%49[^\n]\n"
в порядке, но здесь не нужен.
С ориентированными на строку данными лучше всего прочитать строку с помощью fgets()
и затем проанализировать ее. Намного легче справиться с неправильным вводом.