gpt4 book ai didi

c - 如何使用 sscanf 将变量存储在文件的一行中?

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:36 25 4
gpt4 key购买 nike

我想扫描并存储这一行中的变量:11.0.0.0、255.0.0.0、10.1.0.1、eth9 作为 netIdnetMaskgateway接口(interface)

使用 sscanf(buff1,"%s %s %s %s",netId,netMask,Gateway,Iface); 我可以存储这些变量,但如何存储这些变量当有上例中提到的逗号(,)时?

最佳答案

你必须仔细确定你想要什么。这比您想的要难,但可以做到。 %s 的问题在于它读取到第一个空白字符。逗号不是空格,所以它会包含在 %s 扫描的字符串中,然后输入中没有留下逗号来匹配格式字符串中的逗号。因此,您需要查找一系列“非逗号”。那是一个“扫描集”。

if (sscanf(buff1," %[^,], %[^,], %[^,], %s", netId, netMask, Gateway, Iface) != 4)
…data was malformed…

格式中的前导空格会跳过输入字符串中的可选前导空格,例如 %s 会跳过前导空格。


作为Zack comment 中的注释, 此代码不会保护您免受缓冲区溢出。由于您没有显示任何变量的定义,因此无法知道这是否是一个问题。如果你有:

char buff1[64];
char netId[64];
char netMask[64];
char Gateway[64];
char Iface[64];

那么显然没有一个单独的字段可以大于输入缓冲区并且溢出是不可能的。 OTOH,如果各个字段小于缓冲区,Zack 是对的,您可能会溢出缓冲区。

有(至少)两种方法可以避免这个问题。首先,假设每个目标缓冲区都是 16 字节长(而不是上面显示的 64 字节),那么修改后的代码将是安全的:

if (sscanf(buff1," %15[^,], %15[^,], %15[^,], %15s",
netId, netMask, Gateway, Iface) != 4)
…data was malformed…

这仍然可以在 Iface 元素之后的缓冲区末尾留下一些字节,但在其他方面是安全的。请注意,转换规范中指定的大小比数据定义中的大小小一;这允许空终止符。

替代方案使用 POSIX sscanf()功能:m“分配分配”修饰符。在这种情况下,您将指向 char * 的指针传递给 scanf(),它会分配正确数量的内存:

char *netId = 0;
char *netMask = 0;
char *Gateway = 0;
char *Iface = 0;

if (sscanf(buff1," %m[^,], %m[^,], %m[^,], %ms",
&netId, &netMask, &Gateway, &Iface) != 4)
…data was malformed…

free(netId);
free(netMask);
free(Gateway);
free(Iface);

请注意,如果转换失败,则在 sscanf() 返回之前释放所有由 m 修饰符分配的内存。但是,不能保证如果第三次分配失败,第一次和第二次分配的指针不变。因此,如果整体转换失败,您不应该释放任何已分配的内存。

关于c - 如何使用 sscanf 将变量存储在文件的一行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26654441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com