2011-04-20 103 views
0

嗨,朋友們正在閱讀文件中的數據,並藉助','分隔值。 輸入文件:需要關於strtok函數的想法?

shankar,kumar,ooty 
ravi,,cbe 

代碼:

對於像上述輸入文件輸出:

1:shankar 2:kumar 3:ooty 
1:ravi 2:cbe 3: 

但我需要輸出等,

1:shankar 2:kumar 3:ooty 
1:ravi 2: 3:cbe 

因爲在輸入fi第二行中間數據爲空?你能幫我解決這個問題嗎? 我知道這是因爲在輸入文件的第二行之間沒有空格嗎?請告訴我任何其他的替代方法?或者我應該在讀取之前更改輸入文件?

回答

0

你可以檢查每個item的長度,以確保它不爲0

更重要的是,與循環每一行(example),這樣你不僅限於三個值結合這一點。

+1

我不確定這有幫助。 ',,'被合併成一個單獨的分隔符,所以你永遠不會_get_一個空字符串。 – paxdiablo 2011-04-20 07:39:31

+0

是的,我以爲我需要格式化文件之前,它讀.. – jcrshankar 2011-04-20 08:00:48

2

從手冊頁:「的兩個或多個連續的分隔符字符 分析的字符串中的序列被認爲是一個單一的分隔符在開始或字符串的結束定界符字符被忽略換句話說 方式:所述strtok()返回的令牌總是非空字符串。「

所以如果你必須使用strtok,你將不得不首先修改輸入。

3

沒有什麼從編碼您自己strtok般的功能阻止你:

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

 

static char *myStrTok (char *s, int c) { 
    static char *nextS = NULL; // Holds modified delimiter. 
    static int done = 1;  // Flag to indicate all done. 

    // Initial case. 
    if (s != NULL) { 
     // Return NULL for empty string. 
     if (*s == '\0') { done = 1; return NULL; } 

     // Find next delimiter. 
     nextS = s; 
     while ((*nextS != c) && (*nextS != '\0')) nextS++; 
     done = (*nextS == '\0'); 
     *nextS = '\0'; 
     return s; 
    } 

    // Subsequent cases. 
    if (done) return NULL; 

    // Put delimiter back and find next one. 
    *nextS++ = c; 
    s = nextS; 
    while ((*nextS != c) && (*nextS != '\0')) nextS++; 
    done = (*nextS == '\0'); 
    *nextS = '\0'; 
    return s; 
} 

 

static int prt (char *s) { 
    char *s2 = myStrTok (s, ','); printf ("1: [%s]\n", s2); 
    s2 = myStrTok (NULL, ','); printf ("2: [%s]\n", s2); 
    s2 = myStrTok (NULL, ','); printf ("3: [%s]\n", s2); 
    s2 = myStrTok (NULL, ','); if (s2 != NULL) printf ("4: [%s]\n", s2); 
    printf ("==========\n"); 
} 

int main (void) { 
    char x[] = "shankar,kumar,ooty"; char y[] = "ravi,,cbe"; 
    prt (x); prt (y); 
    printf ("[%s] [%s]\n", x, y); 
    return 0; 
} 

此輸出:

1: [shankar] 
2: [kumar] 
3: [ooty] 
========== 
1: [ravi] 
2: [] 
3: [cbe] 
========== 
[shankar,kumar,ooty] [ravi,,cbe] 

如你所願。它只處理分隔符的單個字符,但在這種情況下似乎足夠了。

+0

謝謝paxdiablo,我嘗試按照您的建議。 – jcrshankar 2011-04-20 07:54:07

0

如果strtok不能做你想做,你可以編寫你自己解析器,沿東西線的工作:

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

static int prt (char *s) { 
    char *s2; 
    s2 = strchr (s, ','); printf ("1: [%*.*s]\n", s2-s, s2-s, s); s = s2 + 1; 
    s2 = strchr (s, ','); printf ("2: [%*.*s]\n", s2-s, s2-s, s); s = s2 + 1; 
    printf ("3: [%s]\n", s); 
    printf ("==========\n"); 
} 

int main (void) { 
    char x[] = "shankar,kumar,ooty"; char y[] = "ravi,,cbe"; 
    prt (x2); prt (y2); 
    return 0; 
} 

這個小樣本顯示了一個strtok解決方案和手動的區別strchr解決方案,輸出是:

1: [shankar] 
2: [kumar] 
3: [ooty] 
========== 
1: [ravi] 
2: [] 
3: [cbe] 
========== 

你需要注意的情況下,你沒有足夠的分隔符(或太多),但應該是一個小 修改。

0

下面是我無恥地從羅布派克複製技術:

void print_tokens(char *s) 
{ 
    char *p, *last; 

    last = s; 

    for (p = strchr(s, ','); p; p=strchr(p+1, ',')){ 
      *p = 0; 
      puts(last); 
      *p = ','; 
      last = p+1; 
    } 
    puts(last); 
} 

我沒有測試上面的代碼,所以有可能會出現一些小瑕疵。但主要的想法應該清楚。