2010-04-22 21 views
6

Mam ciąg formatu "ABCDEFG, 12: 34: 56: 78: 90: 11". Chcę oddzielić te dwie wartości rozdzielone przecinkami na dwa różne ciągi. jak to zrobić w gcc za pomocą języka c.Parsowanie ciągu znaków

+0

Nie jest jasne, jaki rodzaj kontroli składni potrzebujesz. Czy próbujesz tylko zrobić CSV? Czy pierwsze postacie muszą być wielkie? –

Odpowiedz

7

Jedną z możliwości jest coś takiego:

char first[20], second[20]; 

scanf("%19[^,], %19[^\n]", first, second); 
+0

darn! chciałem przegłosować, ale miałem wypadek z bezprzewodową myszą i nie mogę więcej głosować na tę odpowiedź! prosimy o rozważenie tego komentarza jako +1 :) – atzz

+0

+1 za najprostsze rozwiązanie i za jego bezpieczne używanie. – jweyrich

3
char str[] = "ABCDEFG,12:34:56:78:90:11"; //[1] 

char *first = strtok(str, ","); //[2] 
char *second = strtok(NULL, ""); //[3] 

[1] ABCDEFG,12:34:56:78:90:11 

[2] ABCDEFG\012:34:56:78:90:11 
    Comma replaced with null character with first pointing to 'A' 

[3] Subsequent calls to `strtok` have NULL` as first argument. 
    You can change the delimiter though. 

Note: you cannot use "string literals", because `strtok` modifies the string. 
+0

pojawia się błąd segmentacji podczas wypróbowania tego? jaki może być powód? – sfactor

+1

@sfactor - prawdopodobnie wywołujesz 'strtok (" ABCD, etc. ",", ")' - tj. Przekazując literał ciągu do 'strtok'. Natomiast 'strtok' działa poprzez modyfikację oryginalnego ciągu znaków - zastępuje separatory (',') znakami pustymi. Jest to jeden z powodów, dla których nie polecałbym 'strtok' nawet mojemu wrogowi :). (Drugim powodem jest to, że zachowuje stan globalny, a zatem nie jest stały i nie może być bezpieczny dla wątków). – atzz

+0

@ Czynnik: poza tym, co powiedział już atzz, upewnij się, że ciąg, który wywołujesz, jest zakończony, a jego wartość jest pusta. czy możesz opublikować dokładnie to, czego używasz? –

1

Można użyć strtok który pozwoli Ci określić separator i generowania tokenów dla Ciebie.

1

Można użyć strtok:

przykład od cppreference.com:

char str[] = "now # is the time for all # good men to come to the # aid of their country"; 
char delims[] = "#"; 
char *result = NULL; 
result = strtok(str, delims); 
while(result != NULL) { 
    printf("result is \"%s\"\n", result); 
    result = strtok(NULL, delims); 
} 
3

Tak wiele osób sugeruje strtok ... Dlaczego? strtok to pozostałość po programowaniu i jest dobra tylko dla narzędzi 20-liniowych!

Każde wywołanie strtok modyfikuje strToken przez wstawienie pustego znaku po tokenie zwróconym przez to połączenie. [...] [F] unction używa zmiennej statycznej do parsowania ciągu znaków w tokenach. [...] Przekierowywanie wywołań do tej funkcji z dużym prawdopodobieństwem powoduje uszkodzenie danych i niedokładne wyniki.

scanf, jak w Jerry Coffin w answer, jest o wiele lepszą alternatywą. Możesz też zrobić to ręcznie: odszukaj separator za pomocą strchr, a następnie skopiuj części do osobnych buforów.

-1

Spróbuj użyć następującego wyrażenia regularnego znajdzie coś ze znaków AZ az następuje ""

"[AZ] ", jeśli potrzebujesz małą literę też spróbować „[a-zA-Z] "

Jeśli jest to potrzebne, aby szukać drugiej części pierwszej można wypróbować następujące

" [0-9] {2}: [0-9] {2}: [0- 9] {2}: [0-9] {2}: [0-9] {2}: [0-9] {2} "

Istnieje przykład, jak używać REGEX w http://ddj.com/184404797

Dzięki V $ H3R