Во-первых, у вас MACNo
и IPV4
поменялись местами в вашем fscanf
относительно входного образца.
Невозможно сказать точно, не увидев определение структуры, но это выглядит как возможноепереполнение массива.Например, если ваш Computer
был определен так:
struct ComputerType {
double ram;
char ram_unit[2]; /* This needs to be 3 (assuming unit is always 2 chars long) */
char IPV4[16];
char MACNo[17];
};
, когда вы читаете «МБ» в ram_unit
, вы можете получить
ram_unit[0] = 'M'
ram_unit[1] = 'B'
IPV4[0] = '\0'
И тогда, когдаВы читаете IP-адрес в IPV4, что делает его
ram_unit[0] = 'M'
ram_unit[1] = 'B'
IPV4[0] = '1'
IPV4[1] = '3'
[etc]
IPV4[10] = '1'
IPV4[11] = '\0'
Когда вы собираетесь распечатать ram_unit
, функция печати запускается в ячейке памяти &ram_unit[0]
и продолжает печатать, пока не увидитNULL
.Но так как NULL
оказался в IPV4[0]
, и он был перезаписан при чтении по IP-адресу, он не прекратит печать, пока не достигнет значения NULL в IPV4[11]
, и поэтому вы получите неожиданную конкатенацию.*