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

[C++] Prostsze wyświetlanie stringów.

Ostatnio zmodyfikowano 2017-07-08 00:49
Autor Wiadomość
Nucky
Temat założony przez niniejszego użytkownika
[C++] Prostsze wyświetlanie stringów.
» 2017-07-08 00:08:15
Hej, napisałem kod, który pobiera jakiś wyraz, wyświetla go wspak i sprawdza czy jest palindromem. Dopiero zaczynam się uczyć C++, dlatego nurtuje mnie pewna sprawa. Mój kod wygląda następująco:
C/C++
#include <iostream>

using namespace std;

int main()
{
    string wyraz, wspak;
    cout << "Podaj tekst: ";
    cin >> wyraz;
    int n = 0;
    int dlugosc = wyraz.length();
    for( int i = 0; i <=( dlugosc - 1 ); i++ )
    {
        wspak[ i ] = wyraz[ dlugosc - 1 - i ];
        cout << wspak[ i ];
        if( wyraz[ i ] == wspak[ i ] ) n = n + 1;
       
    }
    cout << endl;
    if( n == dlugosc )
         cout << "To palindrom";
   
}

Zastanawia mnie, dlaczego jeżeli wczytam wyraz poprzez
cin >> wyraz;
 to wyświetli się on, gdybym użył później
cout << wyraz
, natomiast po przypisaniu tablicy "wspak", wywołanie
cout << wspak;
 powoduje zawieszenie się programu? (Nie ma tego w tym kodzie, ale tak na początku robiłem i taki był wynik takich operacji)
P-163094
killjoy
» 2017-07-08 00:17:43
Iterujesz po pustym stringu
wspak
 i przypisujesz mu wartości, to jest UB.
P-163095
Nucky
Temat założony przez niniejszego użytkownika
» 2017-07-08 00:26:08
UB? Bo tak w sumie nie rozumiem czy dobrze czy źle :D
P-163096
killjoy
» 2017-07-08 00:34:12
Undefined Behavior - niezdefiniowane zachowanie. Źle, nawet bardzo. Cytując klasyka:


(...)program powodujący niezdefiniowane zachowanie:
zrobi cokolwiek, może np. rozlać kawę na Twój komputer albo spowodować wykolejenie tramwaju.
P-163098
Kinexity
» 2017-07-08 00:34:16
Trochę pozwoliłem sobie poprawić:
C/C++
#include <string>
#include <iostream>

using namespace std;

int main() {
    string wyraz;
    bool czyPalindrom = true;
    cout << "Podaj tekst: ";
    cin >> wyraz;
    for( int i = 0, j = wyraz.length() - 1; i < wyraz.length(); i++, j-- ) {
        cout << wyraz[ j ];
        if( wyraz[ i ] != wyraz[ j ] ) {
            czyPalindrom = false;
        }
    }
    cout << endl << "To" <<( czyPalindrom ? "": " nie" ) << " jest palindrom!" << endl;
}

UB - undefined behavior - niezdefiniowane zachowanie - sytuacja, kiedy sposób wykonywania kodu zależy od kompilatora, ponieważ nie został zdefiniowany w standardzie języka. - w skrócie UNIKAJ.

EDIT: Jeszcze poprawiłem. Tak w ogóle - aż dziwne, że ci nie wywaliło błędu o tym, że nie załączyłeś <string>...
P-163099
mokrowski
» 2017-07-08 00:49:19
Poprawka minimalna, algorytm nie jest optymalny:
C/C++
#include <string> // <-- tego brakowało...
#include <iostream>

using namespace std;

int main()
{
    string wyraz, wspak;
    cout << "Podaj tekst: ";
    cin >> wyraz;
    int n = 0;
    int dlugosc = wyraz.length();
    wspak.resize( dlugosc ); // <- tego brakowało...
    for( int i = 0; i <=( dlugosc - 1 ); i++ )
    {
        wspak[ i ] = wyraz[ dlugosc - 1 - i ];
        cout << wspak[ i ];
        if( wyraz[ i ] == wspak[ i ] ) n = n + 1;
       
    }
    cout << endl;
    if( n == dlugosc )
         cout << "To palindrom";
   
}
Podpowiedź: A po co iterować po całości jak wystarczy do połowy string'a?
P-163100
« 1 »
  Strona 1 z 1