簡體   English   中英

strtok_r-指示分隔符之間什么都沒有

[英]strtok_r - get indicate when there is nothing between the delimiters

我像這樣使用strtok_r

char *the_sting = "a|b||e|f";
char *last;
char *current;

current = (char*)strtok_r(the_sting, "|", &last);

while(current != NULL)
{
    printf(current);
    printf("\n");
    current = (char*)strtok_r(NULL, "|", &last);
}

我得到:

>>a
>>b
>>e
>>f

問題是,當分隔符之間沒有任何內容時,我需要“空白”。

喜歡:

>>a
>>b
>>
>>e
>>f

比較當前的current和先前的current 如果差異大於strlen(previous_current) + 1則跳過一個或多個空白位置。

那么strtok_r不是您的函數,此外,您不能使用字符串文字char *the_sting = "a|b||e|f"; 因為strtok_r修改了這樣的字符串,所以使用數組代替char the_sting[] = "a|b||e|f";

最后,不要以這種方式使用printf printf(current); (很危險),而是:

printf("%s", current);

這個小功能可以滿足您的需求:

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

char *scan(char **pp, char c)
{
    char *s, *p;

    p = strchr(*pp, c);
    if (p) *p++ = '\0';
    s = *pp;
    *pp = p;
    return s;
}

int main(void)
{
    char the_sting[] = "a|b||e|f"; /* I think you mean the_string here */
    char *s, *p = the_sting;

    while (p) {
        s = scan(&p, '|');
        printf("<%s>", s);
    }
    return 0;
}

請注意,一個簡單的char (不是字符串)用作分隔符

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

char *my_strtok_r(char *str, const char *delims, char **store){
    char *p, *wk;
    if(str != NULL){
        *store = str;
    }
    if(*store == NULL) return NULL;
    //*store += strspn(*store, delims);//skip delimiter
    if(**store == '\0') return NULL;
    p=strpbrk(wk=*store, delims);
    if(p != NULL){
        *p='\0';
        *store = p + 1;
    } else {
        *store = NULL;
    }
    return wk;
}


int main(void){
    char the_sting[] = "a|b||e|f";
    char *last;
    char *current;

    current = my_strtok_r(the_sting, "|", &last);

    while(current != NULL)
    {
        printf(current);
        printf("\n");
        current = my_strtok_r(NULL, "|", &last);
    }
    return 0;    
}

自己動手很容易,真的:

#include <string.h>

typedef struct {
    const unsigned char *data;
    size_t len;
} buffer_t;

/* Use strpbrk() for multiple delimiters. */    
buffer_t
memtok(const void *s, size_t length, const char *delim, buffer_t *save_ptr)
{
    const unsigned char *stream,
                        *token;
    size_t len = 0;

    if (NULL == s) {
        stream = save_ptr->data;
    } else {
        stream = s;
        save_ptr->len = length;
    }

    token = stream;

    /* Advance until either a token is found or the stream exhausted. */
    while (save_ptr->len--) {
        if (memchr(delim, *stream, strlen(delim))) {
            /* Point save_ptr past the (non-existent) token. */
            save_ptr->data = stream + 1;
            return (buffer_t) { .data = token, .len = len };
        }

        ++len;
        ++stream;
    }

    /* State : done. */
    *save_ptr = (buffer_t) { .data = NULL, .len = 0 };

    /* Stream exhausted but no delimiters terminate it. */
    return (buffer_t){ .data = token, .len = len };
}

並進行簡短測試:

int main(int argc, char **argv)
{
    const char *the_sting = "a|b||e|f";
    buffer_t kek = { .data = the_sting, .len = 8 },
             token, state;

    token = memtok(the_sting, 8, "|", &state);

    while (token.data != NULL) {
        char test[512];

        memcpy(test, token.data, token.len);
        test[token.len] = 0;
        printf("%s\n", test);

        token = memtok(NULL, 0, "|", &state);
    }

    return 0;
}

這個怎么樣:

char s[] = "1,2,,,,,,,3,4,5,6";
char *tok, *saved;
tok = strtok_r(s, ",", &saved);
do
{
    fprintf(stderr, "tok = %s, saved = %s\n", tok, saved);;
    if (',' == *saved)
    {
        while (',' == *saved++ )
        {
            fprintf(stderr, "saved = %s\n", saved);;
        }
        *saved--;
    }
} while( (tok = (strtok_r(((void *)0), ",", &saved))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM