sscanf解析格式化的字符串

时间:2015-02-10 08:18:02

标签: c parsing scanf

我想读一个包含未定义数量后缀的字符串,所有后缀都以;

分隔
  

示例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是一个不错的选择吗?

2 个答案:

答案 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字符串中进行标记。除了使用strtoksscanf之外,您还可以执行以下操作:

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);
}