C语言 按行读取一份配置文件过后,把所有有效行都保存在一个字符串结构体里面,然后进行读取操作。对port结构体赋值过后,再最macro结构体赋值。第二个for循环是为了提取带空格的字符串,按照代码打印出来,第二个for循环里面的结构体值都是正确的,但是第二个for循环结束后进行打印,结构体就会被部分置零。
将第二个for循环注释掉后不会出现这样的情况,其余地方没有对 _board_init_port_info结构体做操作
memset(& _board_init_port_info.port_info, 0x00, sizeof( _board_init_port_info.port_info));
for(i = _board_init_port_info.head_line; i < _board_init_port_info.end_line ; i++)
{
sscanf(_board_init_profile[i].profile, "%d %d %d %x %d %d %d %d", &index, &lport, &pport, &phyid, &chip_id, &port_type, &phy_type, &poe_type);
_board_init_port_info.port_info[index].lport = (UINT8)lport;
_board_init_port_info.port_info[index].pport = (UINT8)pport;
_board_init_port_info.port_info[index].phyid = (UINT8)phyid;
_board_init_port_info.port_info[index].chip_id = (BOARD_UTL_CHIP_ID_T)chip_id;
_board_init_port_info.port_info[index].port_type = (BOARD_UTL_PORT_TYPE_T)port_type;
_board_init_port_info.port_info[index].phy_type = (BOARD_UTL_PHY_TYPE_T)phy_type;
_board_init_port_info.port_info[index].poe_type = (BOOLEAN_T)poe_type;
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",lport, pport, phyid, chip_id, port_type, phy_type, poe_type);
}
int hex = 0;
for(i = e_board_init_macro.head_line; i < e_board_init_macro.end_line; i++)
{
int len = strlen(_board_init_profile[i].profile);
int isspace = 0;
int j = 0;
for (j = 0; j < len; j++)
{
if (_board_init_profile[i].profile[len-1] == '\n')
{
_board_init_profile[i].profile[len-1] = '\0';
}
if (isspace == 0 && _board_init_profile[i].profile[j] == ' ')
{
_board_init_profile[i].profile[j] = '\0';
isspace = 1;
continue;
}
if (isspace == 1)
{
if (_board_init_profile[i].profile[j] != ' ')
{
memcpy(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info, _board_init_profile[i].profile+j
,sizeof(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info));
break;
}
}
}
for(index = 1; index < 11; index++)
printf("%x\t%x\t%x\t%d\t%d\t%d\t%d\n",_board_init_port_info.port_info[index].lport, _board_init_port_info.port_info[index].pport,
_board_init_port_info.port_info[index].phyid, _board_init_port_info.port_info[index].chip_id, _board_init_port_info.port_info[index].port_type,
_board_init_port_info.port_info[index].phy_type, _board_init_port_info.port_info[index].poe_type);
}
for(index= 1; index < 11; index++)
printf("%x\t%x\t%x\t%d\t%d\t%d\t%d\n",_board_init_port_info.port_info[index].lport, _board_init_port_info.port_info[index].pport,
_board_init_port_info.port_info[index].phyid, _board_init_port_info.port_info[index].chip_id, _board_init_port_info.port_info[index].port_type,
_board_init_port_info.port_info[index].phy_type, _board_init_port_info.port_info[index].poe_type);
通过您提供的代码,我们可以发现在第二个 for 循环中,您使用了 memcpy 函数把一个字符串复制到了另一个字符串里面,由于您没有指定复制的字符串长度,所以 memcpy 函数会把整个源字符串复制到目标字符串中,包括源字符串的结束符 '\0'。
在这种情况下,如果源字符串的长度超过了目标字符串的容量,就会导致字符串覆盖,即源字符串的一部分会覆盖目标字符串的内容。这就是您所遇到的问题,在第二个 for 循环结束后,部分结构体成员被覆盖为 0 的原因。
为了解决这个问题,您可以在调用 memcpy 函数时,指定复制的字符串长度,以避免字符串覆盖。
例如,您可以更改如下代码:
memcpy(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info, _board_init_profile[i].profile+j
,sizeof(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info));
为
size_t len = strlen(_board_init_profile[i].profile + j);
memcpy(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info, _board_init_profile[i].profile+j
,len + 1);
这样,在调用 memcpy 函数时,您就可以指定复制的字符串长度,从而避免字符串覆盖的问题。
但是第二个for循环结束后进行打印,结构体就会被部分置零====这里的结构体是port还是macro?
先把第二个for循环里面的memcpy 其它保持不变。删除试试看还错不错, 可能越界引起数据异常
C语言中对结构体或数组清零的最快方法
https://blog.csdn.net/Pwiling/article/details/47040963