【发布时间】:2015-04-10 04:58:34
【问题描述】:
我想读取一个包含未定义数量的后缀的字符串,所有后缀由;分隔
示例 1:« .txt;.jpg;.png »
示例 2:« .txt;.ods;_music.mp3;.mjpeg;.ext1;.ext2 »
我browsed the web 并写了那段不起作用的代码:
char *suffix[MAX]; /* will containt pointers to the different suffixes */
for (i = 0; i < MAX ; i++)
{
suffix[i] = NULL;
if (suffix_str && sscanf(suffix_str,"%[^;];%[^\n]",suffix[i],suffix_str) < 1)
suffix_str = NULL;
}
第一次迭代后sscanf的结果为0,为什么没有读取到字符串的内容?
应该如何解析包含未定义数量元素的字符串? sscanf是个不错的选择吗?
【问题讨论】:
-
为什么不使用例如拆分它
strtok而不是? -
您正在为源数据使用相同的缓冲区和目标参数。 C9899 § 7.21.6.7p2:“如果复制发生在重叠的对象之间,则行为未定义。” - ......就这么多。回到绘图板。
-
suffix_str是否以某种方式在对sscanf的单次调用中同时处理两个 不同 非重叠缓冲区,其中它同时显示为源缓冲区 和 第二个目标参数?是的,我确定。我不相信这是您的 only 问题,但是看到它会调用未定义的行为,无论如何您都不能依赖任何东西。修复它:使用中间临时缓冲区并在成功时复制回。 -
...我也认为
strtok是一条更好的旅行方式(同意 Joachim 的观点)。 -
这不是您应该使用 sscanf() 的方式。如果要存储指针,请使用
strtok()或简单地编写自己的循环来标记指针。