【发布时间】:2019-07-11 17:53:15
【问题描述】:
我正在用 C 语言解析一个 IP 字符串,我正在使用以下行:
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”的内存地址中,值被正确存储,但带有“AA”的内存地址被覆盖“00”。
XX XX XX XX AA AA AA
什么可能导致这种行为?如何避免这种情况
我希望有:
TFTP_IP_NUMBERS = [192,168,12,30]
【问题讨论】:
-
您正在尝试将数字分配给字符值?
%d。试试%d%*c,让我知道你得到了什么(你应该得到相同的结果,但这会迫使它忽略字符。所以当它被确认时。尝试%c%*d,它只是字符,不确定C是否聪明够了(%d.%d.%d.%d)%*c。试一试。 -
请尝试创建一个minimal reproducible example 向我们展示。例如,
TFTP_IP的确切内容是什么?TFTP_IP_NUMBERS是什么? -
TFTP_IP_NUMBERS[0] 是否包含要写入 sscanf 的解析值的地址?如果你想写入这个数组,那么你必须给出 &TFTP_IP_NUMBERS[0]。以此类推到要传递的所有变量地址。请参阅 sscanf() 手册页。
-
你需要回到你的书、教程或课堂笔记来再次阅读
scanf(和家人)。他们如何告诉您将参数传递给scanf?"%d"说明符解析什么样的类型?这种类型有多少位?至少请参见例如thisscanf(and family) reference。一个好的编译器应该警告你,如果没有,则启用更详细的警告。 -
啊(i)当然误解了这个问题。它的
%hhd你想按照@xing 的建议使用。