2015-02-10 95 views
2

我想读取包含后缀的未定义数量的字符串,全部由;sscanf的解析格式的字符串

例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

'suffix'变量应该是什么? – 2015-02-10 08:22:53

+3

为什么不用它分割而不是['strtok'](http://en.cppreference.com/w/c/string/byte/strtok)? – 2015-02-10 08:23:48

+0

'char * suffix [MAX]'是指向不同后缀的'char *'数组,当没有更多后缀时,它们就是NULL。整个字符串在循环后被解析,以'\ 0'代替';'。 – Jav 2015-02-10 08:25:05

回答

3

首先,覆盖一般性评论,你使用相同的缓冲区为两个源输入和目的地目标调用未定义行为sscanf。根据C标准,这是不允许的。

用于此的正确功能可能是strtok。 A 非常简单的例子出现在下面。

#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 

  • 此代码假定最坏情况的后缀计数为字符串长度的一半,从而单个字符的后缀列表分裂在分隔符上。
  • 后缀数组包含指向现在切片的原始行缓冲区的指针。因此,这些指针的可用性的生存期只有线缓冲区本身的可用性。

希望它有帮助。

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