2011-12-14 43 views
2

我想分析一個空格參數的分隔字符串。例如:是否有strsep窗口變種()

"|One|two|three||octopus|garbagecan||cartwheel||||" 

基本上,我需要能夠按ID拉出任何段,如果段是空返null

strtok不處理空字段,它看起來像是基於* nix系統的strsep()。任何人都知道Windows是否有類似的東西?如果可以,我想盡量避免編寫一個函數來處理這個問題。

+0

也許你可以使用這個嗎? http://www.mail-archive.com/[email protected]/msg11257.html – cnicutar 2011-12-14 23:03:31

+2

爲什麼不直接使用`strsep`。如果它不在你的工具上,從BSD發行版中獲取它。 – 2011-12-14 23:15:20

回答

11

利用其描述只寫功能,它並不十分複雜:

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

char* mystrsep(char** stringp, const char* delim) 
{ 
    char* start = *stringp; 
    char* p; 

    p = (start != NULL) ? strpbrk(start, delim) : NULL; 

    if (p == NULL) 
    { 
    *stringp = NULL; 
    } 
    else 
    { 
    *p = '\0'; 
    *stringp = p + 1; 
    } 

    return start; 
} 

// Test adapted from http://www.gnu.org/s/hello/manual/libc/Finding-Tokens-in-a-String.html. 

int main(void) 
{ 
    char string[] = "words separated by spaces -- and, punctuation!"; 
    const char delimiters[] = " .,;:!-"; 
    char* running; 
    char* token; 

#define PRINT_TOKEN() \ 
    printf("token: [%s]\n", (token != NULL) ? token : "NULL") 

    running = string; 
    token = mystrsep(&running, delimiters); /* token => "words" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "separated" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "by" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "spaces" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "and" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "punctuation" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => "" */ 
    PRINT_TOKEN(); 
    token = mystrsep(&running, delimiters); /* token => NULL */ 
    PRINT_TOKEN(); 

    return 0; 
}