这个程序真的让我很紧张:
我正试图从一个文件中读取一行,其中包含以下信息:
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
请帮我找出我做错了什么。如果你想让我粘贴整个代码,请告诉我。
感谢
首先,您的fscanf
中的MACNo
和IPV4
相对于样本输入反转。
在没有看到结构定义的情况下无法确定,但它看起来像是一个可能的数组溢出。例如,如果您的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
中读取"MB"时,你可能会得到
ram_unit[0] = 'M'
ram_unit[1] = 'B'
IPV4[0] = ' '
然后,当你将IP地址读入IPV4,使其成为
ram_unit[0] = 'M'
ram_unit[1] = 'B'
IPV4[0] = '1'
IPV4[1] = '3'
[etc]
IPV4[10] = '1'
IPV4[11] = ' '
当您打印出ram_unit
时,打印功能将在内存位置&ram_unit[0]
启动,并继续打印,直到看到NULL
为止。但是,由于NULL
最终在IPV4[0]
中,并且在读取IP地址时被覆盖,所以它不会停止打印,直到它在IPV4[11]
处达到NULL,因此您会得到意外的串联。
从这样的文件中读取一行:
1603 Lu,Ma,Mi,Ju,Vi,Sa,No Mar del Plata 08:25 09:20阿根廷航空
使用此:
fscanf(pf, "%d %2s,%2s,%2s,%2s,%2s,%2s,%2s %[^n]s %d:%d %d:%d %[^n]s",
®istro.code,
®istro.dia.lunes,
®istro.dia.martes,
®istro.dia.miercoles,
®istro.dia.jueves,
®istro.dia.viernes,
®istro.dia.sabado,
®istro.dia.domingo,
®istro.destino,
®istro.hSalida.hh,
®istro.hSalida.mm,
®istro.hLlegada.hh,
®istro.hLlegada.mm,
®istro.aerolinea
);