【问题标题】:sscanf overflowing in destination adressessscanf 在目标地址中溢出
【发布时间】: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" 说明符解析什么样的类型?这种类型有多少位?至少请参见例如this scanf (and family) reference。一个好的编译器应该警告你,如果没有,则启用更详细的警告。
  • 啊(i)当然误解了这个问题。它的%hhd 你想按照@xing 的建议使用。

标签: c string parsing embedded


【解决方案1】:

%d 格式说明符处理 int,您将其传递给 较小的 unsigned char,并且也未正确传递指针(两个错误)。

int ip_parts[4];
sscanf( ip, "%d.%d.%d.%d", &ip_parts[0], 
                           &ip_parts[1],
                           &ip_parts[2],
                           &ip_parts[4] ) ;

您可以使用%hhd 格式说明符直接写入unisigned char,但并非所有库都支持hh 大小修饰符,这会降低代码的可移植性。您使用类型 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] ) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多