Operacje na stringach

2011-09-14 07:49

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Witam!
Chciałabym napisać program, który wstawia dowolny ciągu znaków, przekazanego jako parametr funk-
cji, w miejsce k w napisie źródłowym.

Oto kod z maina:

int main(int argc, char * argv[]);
{ 
int k = atoi(argv[3]);
cout << "atoi(argv[3])" << k << endl;
string text1(argv[1]);
string text2(argv[2]);
char *funkcja = wstaw(argv[1],argv[2],k);
string funkcja2 = wstaw1(text1,text2,k); 
}

Szczerze powiedziawszy średnio rozumiem treść zadania, czy mógłby mi ktoś napisać jakąś podpowiedź? Nie chcę rozwiązania tylko jakiejś wskazówki. No bo jak mam wstawić jakieś znaki w k skoro k jest typu int? Wiem że trzeba chyba zrobić jakąś konwersję ale nie bardzo mi to wychodzi :(
Dodam że jestem początkująca..
Pozdrawiam :)

edytowany 1x, ostatnio: madmike, 2011-09-14 20:54

Pozostało 580 znaków

Rev
2011-09-14 07:54
Rev
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 tydzień temu

0

Musisz wstawić text2 w text1 na pozycji k? No to jeżeli używasz C++ i klasy std::string to masz do tego gotową metodę: std::string::insert (<- kliknij).


edytowany 1x, ostatnio: Rev, 2011-09-14 07:54
To jest jakieś zadanie, więc chyba nie chodzi o wywołanie gotowej metody. Wydaje mi się, że trzeba tu walczyć z tablicami znaków - Sarrus 2011-09-14 08:06

Pozostało 580 znaków

2011-09-14 08:52

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

Stworz pomocniczy string, przekopiuj do niego znaki od 0 do k, nastepnie do niego dopisz fragment ktory ma byc wklejony w dane miejsce, a nastepnie do tego stringa doklej resztę stringa pierwszego i zwróc wartość pomocniczego stringa


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

Kumashiro
2011-09-14 08:58
Kumashiro
0

Ciąg wstawiany zastępuje, czy przesuwa znaki?
Jeśli zastępuje, to najpierw sprawdziłbym czy dla n będącego długością ciągu wstawianego, k + n jest większe od rozmiaru ciągu nadpisywanego. Jeśli nie, wystarczy skopiować obszar pamięci zajmowany przez ciąg zastępujący na obszar wskazywany przez wskaźnik na ciąg nadpisywany, przesunięty o k - 1. Jeżeli przekracza, to będziesz musiał zaalokować nową przestrzeń o rozmiarze k + n i dopiero wtedy kopiować. Pamiętaj o bajcie zerowym.
Jeśli przesuwa, to musisz zaalokować nową przestrzeń o rozmiarze m + n + 1, gdzie m i n to długości obu ciągów, następnie skopiować obszar pamięci o rozmiarze k - 1 z ciągu nadpisywanego, dokleić ciąg zastępujący, i w końcu dane z ciągu nadpisywanego od pozycji k do końca. Pamiętaj o bajtach zerowych.

W przypadku std::string nie widzę sensu w babraniu się kopiowaniem, skoro jest insert().

Pozostało 580 znaków

2011-09-14 10:18

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

Tylko tak jak napisał Sarrus. To prawdopodobnie jest jakieś zadanie, dlatego zastanawia mnie wogóle fakt, że są używane tutaj obiekty klasy string, chociaż jeżeli jest to dozwolone, to nie musi alokować większej przestrzeni dla stringa, bo ta klasa robi to automatycznie ;-)


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

Kumashiro
2011-09-14 10:26
Kumashiro
0

Ja tam widzę dwie funkcje. Jedna zwraca std::string, druga cstring. Moja propozycja dotyczy cstringa. W zabawie na std:string nie widzę tutaj sensu, gdyż nie po to są klasy żeby nie korzystać z ich metod. Jeśli jednak z jakiegoś powodu nie wolno korzystać z insert() (np. "widzimisie" wykładowcy), to i tak trzeba to zrobić na wyciągniętym z std::string cstringu, lub udawać że się robi coś twórczego przerzucając znaczki między tablicami, bo międlenie tego na metodach to przerost formy nad treścią.

Pozostało 580 znaków

2011-09-14 12:10

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0
MJay napisał(a)

Stworz pomocniczy string, przekopiuj do niego znaki od 0 do k, nastepnie do niego dopisz fragment ktory ma byc wklejony w dane miejsce, a nastepnie do tego stringa doklej resztę stringa pierwszego i zwróc wartość pomocniczego stringa

Ale właśnie jak mam przekopiować do stringa znaki od 0 do k skoro k jest typu int? Mam zrobić jakąś konwersję? Nie wiem, chyba się w tym gubię :( Proszę kogokolwiek o radę...

Pozostało 580 znaków

2011-09-14 12:23

Rejestracja: 8 lat temu

Ostatnio: 1 godzina temu

0

k to jest pozycja - indeks przecież... Tej liczby nie masz wstawiać, ona określa gdzie wstawić i nie trzeba tu nic konwertować... Nie rozumiesz treści zadania nawet...

Pozostało 580 znaków

2011-09-14 12:24
Moderator

Rejestracja: 9 lat temu

Ostatnio: 2 godziny temu

0

@joaannaan, pozwól, że wyjaśnię na przykładzie.
text_zrodlowy = "Ala ma kota"
text_do_wstawienia = "psa, chomika, świnię i "
oraz k = 7
Teraz wstawmy text_do_wstawienia do text_zrodlowy na miejscu k:
"Ala ma psa, chomika, świnię i kota"

Kapisz?

Pozostało 580 znaków

Kumashiro
2011-09-14 12:26
Kumashiro
0

std::string możesz potraktować jak tablicę. Nie będzie miał nic przeciwko temu. Indeksy tablicy mogą być intami. Zatem std::string[5] zwróci Ci szósty element (znak). Wystarczy objąć to jakąś zgrabną pętlą.

Pozostało 580 znaków

2011-09-14 13:06

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Dziękuję, już bardziej to rozumiem :)

Sarrus napisał(a)

k to jest pozycja - indeks przecież... Tej liczby nie masz wstawiać, ona określa gdzie wstawić i nie trzeba tu nic konwertować... Nie rozumiesz treści zadania nawet...

Sorki, ale dopiero zaczynam programować więc wiele rzeczy jeszcze nie rozumiem, zresztą napisałam już w pierwszym poście że nie wiem za bardzo o co chodzi... Bardzo chcę się nauczyć tego języka i przykro mi że ktoś na samym początki już mi pojeżdza ! Pozdrawiam.

Aj tam żaden pojazd. Fajktycznie napisałaś "Szczerze powiedziawszy średnio rozumiem treść zadania" więc sorki. Powinienem czasem wyhamować ;). - Sarrus 2011-09-14 13:48
Spotkasz się z dużo gorszymi komentarzami na tym forum. To zachęca do samodzielnego szukania odpowiedzi w internecie (przynajmniej mnie to tak mobilizowało) - MJay 2011-09-14 18:47

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0