需要把各种类型的数据整合到同一个字符串中的时候,我想到了用printf的近亲——sprintf,后来发现sprintf整合的结果总是不正确,下面上代码片段
char text[1];
/* print ip addresses and udp ports */
sprintf(text,"%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d",
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
sport,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4,
dport);
ui->listWidget->addItem(text);
char sip[10],sp[10],dip[10],dp[5];
sprintf(sip,"%d.%d.%d.%d",
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4);
sprintf(dp,"%d",sport);
sprintf(dip,"%d.%d.%d.%d",
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4);
sprintf(dp,"%d",dport);
ui->tableWidget->insertRow(row);
ui->tableWidget->setItem(row,0,new QTableWidgetItem(text));
ui->tableWidget->setItem(row,1,new QTableWidgetItem(sport));
ui->tableWidget->setItem(row,3,new QTableWidgetItem(text));
ui->tableWidget->setItem(row,4,new QTableWidgetItem(dport));
后面的tableWidegt中的数据总是不正确的。
上网找原因发现是不安全的sprintf函数造成的,前面的字符数组空间开得太小了,但是sprintf在执行时不会考虑前面的字符串数组空间是否足够,它会自动地占用后续空间,这样就会影响后面的数据。后来我将所有的暂存字符串的数组都换成了一个,程序结果就正常了。
结论:使用sprintf时要注意内存是否超出。