2012-03-12 55 views
0

我想從字符串中提取2子:提取從線二子可預測的格式

char test[] = "today=Monday;tomorrow=Tuesday"; 
char test1[20]; 
char test2[20]; 

sscanf(test, "today=%s;tomorrow=%s", test1, test2); 

當我今天打印出來,我得到週一也是字符串的其餘部分。我想test1是星期一,我希望test2是星期二。我如何正確使用sscanf?

回答

0

當使用%s個標籤,sscanf的讀取,直到下一個空格被發現,根據該文件:http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

因此,例如,您可以將您的字符串改變

char test[] = "today=Monday tomorrow=Tuesday"; 
+0

嗯,如果我不能修改原始測試字符串,我該怎麼辦? – egidra 2012-03-12 03:52:10

+0

如果您無法修改原始字符串,請嘗試使用while循環的組合。在測試中循環字符,直到遇到一個=。然後開始保存字符到test1,直到遇到a;。對於test2重複類似。 – mkasberg 2012-03-12 03:55:24

+0

像這樣:'int i = 0; while(test [i]!='='){i ++}; int j = 0; while(test [i]!=';'){test1 [j] = test [i];我++; j ++}' – mkasberg 2012-03-12 03:58:19

3

的關鍵是告訴sscanf在哪裏停止。
在你的情況下,將在分號。
如果你沒有指定,那麼%s說直到下一個空白爲止,正如@mkasberg所說。

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

int main() { 
    char *teststr = "today=Monday;tomorrow=Tuesday"; 
    char today[20]; 
    char tomorrow[20]; 

    sscanf(teststr, "today=%[^;];tomorrow=%s", today, tomorrow); 
    printf("%s\n", today); 
    printf("%s\n", tomorrow); 

    return 0; 
} 

產地:

 
Monday 
Tuesday 

編輯:

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

int main() { 
    const char teststr[] = "today=Monday;tomorrow=Tuesday"; 
    const char delims[] = ";="; 
    char *token, *cp; 
    char arr[4][20]; 
    unsigned int counter = 0; 
    unsigned int i; 

    cp = strdup(teststr); 
    token = strtok(cp, delims); 
    strcpy(arr[0], token); 

    while (token != NULL) { 
    counter++; 
    token = strtok(NULL, delims); 
    if (token != NULL) { 
     strcpy(arr[counter], token); 
    } 
    } 

    for (i = 0; i < counter; i++) { 
    printf("arr[%d]: %s\n", i, arr[i]); 
    } 

    return 0; 
} 

結果:

您可以將此替代使用 strtok找到有用