1

私は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
4

5 に答える 5

1

current現在と以前の を比較しcurrentます。差がそれ以上の場合strlen(previous_current) + 1、1つ以上の空の場所がスキップされました。

于 2013-05-23T11:19:27.220 に答える
1

次に、関数ではありません。さらに、そのような文字列を変更するためstrtok_r、文字列リテラルを使用できません。代わりに配列を使用してくださいchar *the_sting = "a|b||e|f";strtok_rchar 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区切り文字として単純な (文字列ではない) が使用されていることに注意してください。

于 2013-05-23T12:04:01.700 に答える
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))));
于 2014-05-14T11:35:32.780 に答える
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;
}
于 2013-05-23T11:58:21.940 に答える
0
#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;    
}
于 2013-05-23T11:25:00.810 に答える