C fscanf странным образом объединяет две строки - PullRequest
0 голосов
/ 25 мая 2011

Эта программа действительно действует мне на нервы:

Я пытаюсь прочитать строку из файла со следующей информацией:

512 MB 136.186.99.1 00-25-B3-0B-31-29

в формате double string string string

и код, который я использую:

fscanf(filePtr, "%lf %s %s %s", &Computer[i].ram, Computer[i].ram_unit, Computer[i].MACNo, Computer[i].IPV4);

, но когда я печатаю Computer[i].ram_unit, я получаю:

MB136.186.99.1

Пожалуйста, помогите мне узнать, чтоя делаю неправильноДайте мне знать, если вы хотите, чтобы я вставил весь код.

Спасибо

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Во-первых, у вас 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], и поэтому вы получите неожиданную конкатенацию.*

0 голосов
/ 04 марта 2014

Чтобы прочитать строку из файла, подобного этому:

1603 Лу, Ма, Ми, Джу, Ви, Са, Но Мар дель Плата 08:25 09:20 Aerolineas Argentinas

Используйте это:

fscanf(pf, "%d %2s,%2s,%2s,%2s,%2s,%2s,%2s %[^\n]s %d:%d %d:%d %[^\n]s",
    &registro.code,
    &registro.dia.lunes,
    &registro.dia.martes,
    &registro.dia.miercoles,
    &registro.dia.jueves,
    &registro.dia.viernes,
    &registro.dia.sabado,
    &registro.dia.domingo,
    &registro.destino,
    &registro.hSalida.hh,
    &registro.hSalida.mm,
    &registro.hLlegada.hh,
    &registro.hLlegada.mm,
    &registro.aerolinea
);
...