Frage

Wie Sicherheit Parse tab-Trennzeichenfolge? beispielsweise: test \ TBLA-bla-bla \ t2332?

War es hilfreich?

Lösung

strtok() ist eine Standardfunktion für Strings mit beliebigen Begrenzungszeichen Parsen. Es ist jedoch nicht Thread-sicher. Ihre C-Bibliothek der Wahl könnte eine Thread-sichere Variante hat.

Eine andere standardkonforme Art und Weise (schrieb ihn nur auf, es ist nicht getestet ):

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

int main()
{
    char string[] = "foo\tbar\tbaz";
    char * start = string;
    char * end;
    while ( ( end = strchr( start, '\t' ) ) != NULL )
    {
        // %s prints a number of characters, * takes number from stack
        // (your token is not zero-terminated!)
        printf( "%.*s\n", end - start, start );
        start = end + 1;
    }
    // start points to last token, zero-terminated
    printf( "%s", start );
    return 0;
}

Andere Tipps

Verwenden strtok_r statt strtok (falls verfügbar). Es hat ähnliche Verwendung, außer es Reentry ist, und es nicht ändern Sie die Zeichenfolge wie strtok tut. [ Edit: Eigentlich misspoke ich. Wie Christoph weist darauf hin, ersetzt strtok_r die Trennzeichen durch ‚\ 0‘. Also, sollten Sie auf eine Kopie des Strings arbeiten, wenn Sie die ursprüngliche Zeichenfolge erhalten möchten. Aber es ist besser, weil es zu strtok einspringende und Thread-sicher]

strtok wird Ihre ursprüngliche Zeichenfolge geändert verlassen. Es ersetzt das Trennzeichen mit ‚\ 0‘. Und wenn die Zeichenfolge geschieht in a eine Konstante, gespeichert sein Nurlesespeicher (einige Compiler dies tun wird), können Sie tatsächlich eine Zugriffsverletzung erhalten.

Mit strtok() von string.h.

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

int main ()
{
    char str[] = "test\tbla-bla-bla\t2332";
    char * pch;
    pch = strtok (str," \t");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, " \t");
    }
    return 0;
}

Sie können jede beliebige regex-Bibliothek verwenden oder sogar die GLib GScanner finden Sie unter hier und hier für weitere Informationen.

Noch eine andere Version; Diese trennt die Logik in eine neue Funktion

#include <stdio.h>

static _Bool next_token(const char **start, const char **end)
{
    if(!*end) *end = *start;    // first call
    else if(!**end)             // check for terminating zero
        return 0;
    else *start = ++*end;       // skip tab

    // advance to terminating zero or next tab
    while(**end && **end != '\t')
        ++*end;

    return 1;
}

int main(void)
{
    const char *string = "foo\tbar\tbaz";

    const char *start = string;
    const char *end = NULL; // NULL value indicates first call

    while(next_token(&start, &end))
    {
        // print substring [start,end[
        printf("%.*s\n", end - start, start);
    }

    return 0;
}

Wenn Sie eine binäre sichere Art und Weise eine bestimmte Zeichenkette tokenize:

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

void tokenize(const char *str, const char delim, const size_t size)
{
        const char *start = str, *next;
        const char *end = str + size;

        while (start < end) {
                if ((next = memchr(start, delim, end - start)) == NULL) {
                        next = end;
                }

                printf("%.*s\n", next - start, start);
                start = next + 1;
        }
}

int main(void)
{
        char str[] = "test\tbla-bla-bla\t2332";
        int len = strlen(str);

        tokenize(str, '\t', len);

        return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top