2009-12-07 12 views
5

Mam ciąg: "[email protected]"wydobywające podciągi w C

Szukam napisać program w C, który będzie dodatkowo wszystkie trzy podciągi ("foo", "bar" i "baz") i umieścić każdy w jego własnym ciąg.

P.S. Nie martw się, to jest praca domowa , a nie.

+0

Btw, wygląda na dup. – monksy

+0

Czy zrobiłeś jakieś postępy? Prawdopodobnie uzyskasz więcej odpowiedzi, jeśli zadasz bardziej szczegółowe pytanie. Teraz prosisz kogoś o napisanie całego programu w polu odpowiedzi. – benzado

Odpowiedz

10

To, czego szukasz, to: strtok. Pozwala także ustawić ograniczniki.

+4

Tak długo jak token jest modyfikowany, można go modyfikować. Nie rób 'strtok (" foo $ bar @ baz "," $ ");' –

+1

Dlaczego wynik 7 jest tam, gdzie jest 9 przegranych i 1 downvote. Chyba ktoś nie lubi strtok .. dziwne. – monksy

1

jeśli nie jest to praca domowa :-) niż strtok nie jest zalecane, jeśli nie można użyć C++ (dlaczego?), Należy użyć strtok_r (wersja reentrent)

0

Strtok utrzymuje statycznego bufora podczas tokenizing że zostanie nadpisany, gdy zostanie wywołany w innym miejscu z nowym ciągiem, który nie będzie NULL, co może spowodować przerwanie funkcjonalności, której szukasz. na przykład wplecione połączenia z różnymi ciągami.

Zamiast tego możesz użyć strsep, który jest podobny do strtok, ale bufor tymczasowy możesz zachować sam, na wypadek, gdybyś potrzebował do tokenizacji wielu ciągów znaków, np. z połączonymi połączeniami z różnymi ciągami.

W małych przypadkach problem ten prawdopodobnie nie powstanie, ale może w większych projektach.

EDYCJA: nie jest std c, więc upewnij się, że masz tę funkcję, zanim spróbujesz jej użyć. Wiem na pewno, że jest ona dostępna na BSD i ewentualnie inne UNIXów

EDIT: strsep i strtok_r wydają się mieć taką samą funkcjonalność

1

Ponieważ jest prosto C, może to być zabawa, aby ponownie jak ciągi są przechowywane i zakończone. Skoro masz jeden znak kończącego dla każdej sekcji, można po prostu uczynić go prawdziwym terminatorem („\ 0”) i zostawić sznurki w lokalu:

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

int main(int argc, char **argv) { 

char *s1,*s2,*s3, *test = "[email protected]"; 
char *buf=(char *)malloc(100); 
char *p,c; 

strcpy(buf, test); 

s1 = p = buf; 
while(c = *p) { 
    if (c == '$') { *p = '\0'; s2 = p+1; } 
    if (c == '@') { *p = '\0'; s3 = p+1; } 
    p++; 
} 

printf("s1 = %s\n",s1); 
printf("s2 = %s\n",s2); 
printf("s3 = %s\n",s3); 

} 

Nie chciałbym to zrobić w kodzie produkcji, w ten dzień i wiek. Ale droga powrotna, kiedy jeden rzut na pętlę i jedna kopia do przechowywania, byłaby uważana za dużą wygraną.

+0

Darn, 2 przechodzi jeśli policzysz strcpy. Pętla "kopiuj i ustaw" jest pozostawiona jako ćwiczenie dla czytelnika. –

+0

niż nie rób najpierw kopii :) – warren

Powiązane problemy