2012-06-07 139 views
0

在這裏,我有一個字符arrray,其中有一些分離器在那裏。我如何從字符數組中分割字符串

字符數組是char sentence []="abc_12.22.32.42";

我想從使用sscanf的句子讀ABC,12,22,32,42。

我試着用sscanf,但它給出不同的輸出。

我在這裏發佈了兩個代碼之一,它的工作正常。

如果我%s = %s那麼它的閱讀作品abc = 12。爲什麼我們必須在分配器之間留出空間。

任何方式來實現這一目標。

不工作代碼:

#include <stdio.h> 

int main() 
{ 
    char sentence []="abc_12.22.32.42"; 
    char str [20]; 
    char str1 [20]; 
    char str2 [20]; 
    char str3 [20]; 
    sscanf (sentence,"%s_%s.%s.%s.%s",str,str1,str2,str3); 
    printf ("%s --> %s --> %s --> %s --> %s\n",str,str1,str2,str3); 
    return 0; 
} 

輸出:

abc_12.22.32.42--> -- � -->�Tl�s --> (null) 

預期輸出:

abc --> 12 --> 22 --> 32 --> 42 

工作代碼:

/* sscanf example */ 
#include <stdio.h> 

int main() 
{ 
    char sentence []="abc = 12"; 
    char str [20]; 
    char str1 [20]; 
    char str2 [20]; 
    char str3 [20]; 
    if(sscanf(sentence,"%s = %s",str,str1) < 5) ; 
     printf ("%s--> %s\n",str,str1); 
    return 0; 
} 

輸出:

abc--> 12 
+0

[分割字符串在C分隔符]的可能重複(http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c的最佳方式) – dirkgently

回答

3

當指定這樣的格式:%s_%s.%s.%s.%s,您的程序無法知道第一個字符串不能包含字符'_''.'。這就是爲什麼sscanf(sentence,"%s_%s.%s.%s.%s", str0, str1, str2, str3, str4);導致全句存儲在str0中的原因。

如果你想留在sscanf,你必須改變你希望的格式:

char sentence[] = "abc_12.22.32.42"; 
char str0[20], str1[20], str2[20], str3[20], str4[20]; 
sscanf (sentence,"%19[^_]_%19[^.].%19[^.].%19[^.].%19[^.]", 
     str0, str1, str2, str3, str4); 
printf ("%s --> %s --> %s --> %s --> %s\n", 
     str0, str1, str2, str3, str4); 

%19[^_]導致str0包含最多19個字符(20 '\0')和防止字符'_'成爲部分str0。因此,輸出根據需要變成abc --> 12 --> 22 --> 32 --> 42

另外,您可以使用strtok

0

更換 '' 和 ' - ' 由 '',另外,你還需要一個陣列STR4

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char sentence []="abc_12.22.32.42"; 
    char str [20]; 
    char str1 [20]; 
    char str2 [20]; 
    char str3 [20]; 
    char str4 [20]; 

    int i; 
    for (i=0; i<strlen(sentence); i++) { 
     if (sentence[i] == '_') sentence[i] = ' '; 
     if (sentence[i] == '.') sentence[i] = ' '; 
    } 

    sscanf (sentence,"%s %s %s %s %s",str,str1,str2,str3, str4); 
    printf ("%s--> %s --> %s -->%s --> %s\n",str,str1,str2,str3, str4); 
    return 0; 
}