我想读一个包含未定义数量后缀的字符串,所有后缀都以;
示例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
是一个不错的选择吗?
答案 0 :(得分:3)
首先,正如一般注释中所述,您通过使用与sscanf
的源输入和目标目标相同的缓冲区来调用未定义的行为。根据C标准,这是不允许的。
用于此目的的正确函数可能是strtok
。一个非常的例子就在下面。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char line[] = ".txt;.ods;_music.mp3;.mjpeg;.ext1;.ext2";
size_t slen = strlen(line); // worst case
char *suffix[slen/2+1], *ext;
size_t count=0;
for (ext = strtok(line, ";"); ext; ext = strtok(NULL, ";"))
suffix[count++] = ext;
// show suffix array entries we pulled
for (size_t i=0; i<count; ++i)
printf("%s ", suffix[i]);
fputc('\n', stdout);
}
<强>输出强>
.txt .ods _music.mp3 .mjpeg .ext1 .ext2
备注强>
希望它有所帮助。
答案 1 :(得分:0)
有几种方法可以从C字符串中进行标记。除了使用strtok
和sscanf
之外,您还可以执行以下操作:
char *temp = suffix_str;
char *suffix[i];
for (int i = 0; i < MAX; i++)
{
int j = 0;
char buf[32];
while (*temp != '\0' && *temp != '\n' && *temp != ';')
{
buf[j++] = *temp;
temp++;
}
buf[j] = 0;
if (*temp == ';') temp++;
suffix[i] = malloc((strlen(buf) + 1) * sizeof(char));
//handle memory allocation error
strcpy(suffix[i], buf);
}