C fscanf奇怪地串联了两个字符串

问题描述

| 这个程序真的让我感到不安: 我正在尝试从文件中读取包含以下信息的行:
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\",&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
);