Zapis do zmiennej string
Ostatnio zmodyfikowano 2017-03-18 16:30
Barczak97 Temat założony przez niniejszego użytkownika |
Zapis do zmiennej string » 2017-03-18 14:55:47 Witajcie po dużej przerwie na nowo przypominam sobie c++'a. Wybaczcie jak post będzie trochę nie zrozumiały, ale sam nie wiem jak opisac problem. Najpierw wkleję kod, a później zacznę opisywać, będzie łatwiej wam zrozumieć. Dodam jeszcze, że wklejam kod, który tylko pokazuje idee problemu, ponieważ mój kodzik jest strasznie długi. #include <iostream> #include <string> using namespace std; int main() { string napis = "wyraz"; int length = napis.length(); string zamienionyNapis; int a = 0; for( int i = length; i >= 0; i-- ) { zamienionyNapis[ a ] = napis[ i ]; a++; } for( int i = 0; i <= 4; i++ ) cout << zamienionyNapis[ i ]; cout << zamienionyNapis; return 0; }
Program ma na celu wypisanie "wyraz" od tylu czyli "zaryw" i zapisanie go do zmiennej. Chciałbym aby napis już odwrócony został zapisany do zmiennej string. cout << zamienionyNapis; Nie wypisuje nic, Tak jakby był pusty. Siedzę nad tym z 4 godziny, próbowałem już chyba wszystkiego :/ Z góry dziękuję za pomoc. |
|
carlosmay |
» 2017-03-18 15:22:33 for( int i = length; i >= 0; i-- ) |
Wartość licznika pętli i ma nieprawidłową wartość. Jakie indeksy ma tablica o rozmiarze lenght ? |
|
Barczak97 Temat założony przez niniejszego użytkownika |
» 2017-03-18 15:30:45 Tablica length to po prostu dlugosc wyrazu w tym przypadku 4 bo od 0. Jeżeli o to Ci chodzi. |
|
carlosmay |
» 2017-03-18 15:32:44 Tak: jest to wartość 4, a jaką wartość nadaną ma zmienna i w nagłówku pętli? Jeśli nie wiesz, możesz wypisać sobie wartość zmiennej length przed jej użyciem. edit: cout << zamienionyNapis; Nie wypisuje nic | Wypisuje, ale w tym przypadku na pierwszym miejscu stoi '\0' i na tym kończy się wypisywanie przepisanego słowa.edit2: Ten string jest pusty. Ma długość 0 , czyli możliwe jest nadpisanie znaku '\0' kończącego łańcuch (co też jest UB). Każdy następny znak pisze po cudzej pamięci. Skorzystaj z metod udostępnionych wraz z klasą std::string. |
|
Barczak97 Temat założony przez niniejszego użytkownika |
» 2017-03-18 15:43:30 Okej length ma indeks 5. Aczkolwiek co to ma do rzeczy w zapisaniu tego wyrazu do zmiennej string. edit: Dlaczego na pierwszym miejscu stoi '/0' wiem ze oznacza on koniec string'a, ale nawet jesli tablica jest o 1 pole za mala to cout powinien wypisac "zary" obcinajac jedna literke. Jesli na poczatku jest '/0' to wychodzi na to ze jest pusty. |
|
carlosmay |
» 2017-03-18 15:54:59 Ano to: w y r a z \0 ^ ^ ^ ^ ^ ^ 0 1 2 3 4 5? I teraz przepisujesz: zamienionyNapis[ 0 ] = napis[ 5 ]; |
|
Barczak97 Temat założony przez niniejszego użytkownika |
» 2017-03-18 16:03:30 Powoli zaczynam rozumieć, a jak przypisac to pętlą? Btw: dzięki za łopatologiczne wyjaśnianie :)
edit: zamienionyNapis[0]=napis[5] ? ,a nie zamienionyNapis[0]=napis[4] Dodatkowo na koncu petli dodaje mi losowy znak z tablicy ASCII ?
|
|
carlosmay |
» 2017-03-18 16:09:53 Zarezerwuj odpowiedni długi string wynikowy, aby nie pisać po nieswojej pamięci. I przekopiuj jak leci od końca do początku (maksymalny indeks tablicy jest o jeden mniejszy od jej rozmiaru). Najlepiej użyć do tego celu istniejących już rozwiązań dostarczonych wraz z klasą std::string . np: int main() { std::string word { "wyraz" }; std::string reverseWord; for( auto crit = word.crbegin(); crit != word.crend(); ++crit ) { reverseWord.push_back( * crit ); } std::cout << reverseWord << '\n'; } |
|
« 1 » 2 |