Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zapis do zmiennej string

Ostatnio zmodyfikowano 2017-03-18 16:30
Autor Wiadomość
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.
C/C++
#include <iostream>
#include <string>
using namespace std;
int main() {
   
    string napis = "wyraz";
    int length = napis.length(); // długosc napisu "wyraz"
    string zamienionyNapis;
   
    int a = 0;
    for( int i = length; i >= 0; i-- ) //ta petla przypisuje literki
    {
        zamienionyNapis[ a ] = napis[ i ];
        a++;
       
    }
    for( int i = 0; i <= 4; i++ ) cout << zamienionyNapis[ i ]; //ta petla wyswietla twoj napis od tylu
   
   
    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.

P-159093
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
?
P-159094
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.
P-159096
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:
string zamienionyNapis;
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.
P-159098
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.
P-159100
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 ];
P-159103
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 ?



P-159107
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:
C/C++
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';
}
P-159108
« 1 » 2
  Strona 1 z 2 Następna strona