2015-02-10 163 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); 
}