我正在用C解析IP字符串,并且正在使用以下行:
# undo last commit while keeping changes in the working tree
git reset HEAD^
# redo the adding part without the unwanted files
git add file1 file2 file3
# commit and push
git commit -m "message"
git push --force origin HEAD
该行效果很好(它已正确解析),但在不应写入的地方进行了写。在带有“ XX”的内存地址中,值已正确存储,但带有“ AA”的内存地址被覆盖了“ 00”。
typedef unsigned char UI_8;
UI_8 TFTP_IP_NUMBERS[4];
UI_8 TFTP_IP[15]; // Should be something lige "192.168.12.30"
sscanf(TFTP_IP , "%d.%d.%d.%d", TFTP_IP_NUMBERS[0],
TFTP_IP_NUMBERS[1],
TFTP_IP_NUMBERS[2],
TFTP_IP_NUMBERS[3]);
什么可能导致这种行为?如何避免这种情况
我希望有:
XX XX XX XX AA AA AA
答案 0 :(得分:1)
%d
格式说明符处理了一个int
,您正在向它传递一个更小 unsigned char
,并且还没有正确传递指针(两个错误)。 / p>
int ip_parts[4];
sscanf( ip, "%d.%d.%d.%d", &ip_parts[0],
&ip_parts[1],
&ip_parts[2],
&ip_parts[4] ) ;
您可以使用unisigned char
格式说明符直接写入%hhd
,但是并非所有库都支持hh
size修饰符,这会使代码的可移植性降低。您使用过UI8_t类型的事实表明您可能没有标准的uint8_t,因此可能未在使用与C99兼容的库或编译器-在这种情况下,%hhu
也可能不起作用。
UI8 ip_parts[4];
sscanf( ip, "%hhu.%hhu.%hhu.%hhu", &ip_parts[0],
&ip_parts[1],
&ip_parts[2],
&ip_parts[4] ) ;