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
Odpowiedz
Jedną z możliwości jest coś takiego:
char first[20], second[20];
scanf("%19[^,], %19[^\n]", first, second);
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.
pojawia się błąd segmentacji podczas wypróbowania tego? jaki może być powód? – sfactor
@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
@ 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? –
Można użyć strtok który pozwoli Ci określić separator i generowania tokenów dla Ciebie.
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);
}
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.
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
- 1. Parsowanie sformatowanego ciągu
- 2. Parsowanie ciągu C# LINQ wyrażenie
- 3. Parsowanie ciągu znaków ISO 8601 do DateTime w .NET?
- 4. Parsowanie ciągu znaków w języku C#; czy istnieje czystszy sposób?
- 5. Usuwanie znaków z ciągu znaków
- 6. TeX: parsowanie ciągów i usuwanie białych znaków
- 7. Parsowanie wartości dziesiętnej z ciągu w Ruby
- 8. Parsowanie ciągu do daty bez użycia SimpleDateFormat?
- 9. grep bez ciągu znaków
- 10. Tłumaczenie przypisanego ciągu znaków
- 11. Pierwsze 10 znaków ciągu?
- 12. Nieokreślona stała ciągu znaków
- 13. Opcje inicjalizacji ciągu znaków
- 14. Funkcje ciągu znaków?
- 15. C# parsowanie dowolnego ciągu formatu daty do datetime
- 16. Dopasowywanie sekwencji kolejnych znaków w ciągu znaków
- 17. Usuń n znaków od początku ciągu znaków
- 18. Zliczanie liczby znaków w ciągu znaków
- 19. Formatowanie ciągu znaków na 10 znaków
- 20. Zastępowanie wielu znaków w ciągu znaków
- 21. Usuwanie znaków niealfanumerycznych z ciągu znaków
- 22. Usuwanie wielu typów znaków z ciągu znaków
- 23. Usuwanie białych znaków w ciągu znaków
- 24. Usuwanie białych znaków w ciągu znaków XML
- 25. Zastępowanie wiodących znaków w ciągu znaków
- 26. Sprawdzanie znaków specjalnych w ciągu znaków
- 27. Zamień wiele znaków w ciągu znaków (XSLT)
- 28. Usuwanie zduplikowanych znaków z ciągu znaków
- 29. Usuwanie określonych znaków z ciągu znaków
- 30. Parsowanie obiektu json na ciąg znaków
Nie jest jasne, jaki rodzaj kontroli składni potrzebujesz. Czy próbujesz tylko zrobić CSV? Czy pierwsze postacie muszą być wielkie? –