Wie in Sicherheit Parse Tab getrennte Zeichenfolge?
-
27-09-2019 - |
Frage
Wie Sicherheit Parse tab-Trennzeichenfolge? beispielsweise: test \ TBLA-bla-bla \ t2332?
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;
}
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;
}