2013-07-24 44 views
1

我試圖在C中對字符串進行不同的變量排序(當我說字符串時,我的意思是字符數組)。該字符串包含較小的「塊」,由製表符分隔,並且我希望sscanf在每次調用時將下一個「塊」放入一個字符串中。使用scanf一次返回一個字符串,用特定字符分隔

例如,如果字符串是00:00:00:00 12345 abcd,我想第一個sscanf的調用把00:00:00:00一個字符串,接下來的sscanf調用把12345字符串中,等

我不明白爲什麼我的代碼不起作用。我有sscanf(s, "%[^\t]%*c", buf),我認爲這應該告訴sscanf讀取所有內容到一個製表符,然後%*c告訴它讀取但放棄製表符(以便下次調用sscanf時,沒有前導製表符字符)。不會有超過1個製表符分隔字符串中的塊。

我確信有比使用sscanf更好的方法,如果有人告訴我,這會很棒,但我也想弄清楚,因爲它似乎很煩人,我不知道爲什麼它不起作用。感謝您的幫助

+3

'的scanf()'是邪惡的,不使用它,這是一個特別糟糕的主意使用它的符號化。 'strchr()','strstr()'和'strtok_r()'都是更好的選擇。 – 2013-07-24 12:35:43

+0

scanf()沒有錯。請提供一個代碼示例,其中指出了使用scanf()的合理嘗試,並且我會幫助您實現它。 – JackCColeman

回答

3

查看strtok可以更輕鬆地分割它。

另外請注意,您的sscanf調用不會修改字符串,只是從中提取(即在第二個調用中,您不能僅僅將s傳回給它,而不先修改它。)爲此,使用sscanf會做:

while (/* do your own check on str here*/) 
{  
    // Scan the next part 
    sscanf(str, "%[^\t]%s", firstBit, remain); 

    // Copy it back and do it again 
    strcpy(str, remain); // Being careful here not to sscanf into the source string!! 
} 
+0

謝謝..我知道它不會修改它,我只是認爲%* c會在製表符 –

+0

之後啓動sscanf的下一個調用,不會影響下一個調用 - 如果它是一個scanf可能會這樣做......因爲您正在使用用戶輸入,但每次字符串都是相同的。 – noelicus

1

示例代碼:

#include <stdio.h> 

int main(){ 
    char s[] = "00:00:00:00\t12345\tabcd"; 
    char buf[32]; 
    int pos = 0, read_len; 

    //%n : reading character count into read_len address 
    //pos : next read position 
    while(1==sscanf(s + pos, "%[^\t]%n%*c", buf, &read_len)){ 
     printf("%s\n", buf); 
     pos += read_len + 1; 
     if(s[pos] == '\0') break; 
    } 
    return 0; 
} 
相關問題