C可以奇怪地连接两个字符串



这个程序真的让我很紧张:

我正试图从一个文件中读取一行,其中包含以下信息:

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中的MACNoIPV4相对于样本输入反转。

在没有看到结构定义的情况下无法确定,但它看起来像是一个可能的数组溢出。例如,如果您的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",
    &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
);

相关内容

  • 没有找到相关文章

最新更新