问题描述
|
这个程序真的让我感到不安:
我正在尝试从文件中读取包含以下信息的行:
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
反转了。
在没有看到结构定义的情况下无法确定,但是看起来数组可能溢出。例如,如果您的“ 8”的定义如下:
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];
};
当您将\“ MB \”读入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
。但是由于ѭ15最终以ѭ17开头,并且在您读取IP地址时被覆盖,因此它将一直停止打印,直到在ѭ18处变为NULL为止,因此您会遇到意外的串联。
,要从这样的文件中读取一行:
1603 Lu,Ma,Mi,Ju,Vi,Sa,No Mar del Plata 08:25 09:20 Aerolineas Argentinas
用这个:
fscanf(pf,\"%d %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
);