[C++] Prostsze wyświetlanie stringów.
Ostatnio zmodyfikowano 2017-07-08 00:49
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: #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) |
|
killjoy |
» 2017-07-08 00:17:43 Iterujesz po pustym stringu wspak i przypisujesz mu wartości, to jest UB. |
|
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 |
|
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.
|
|
|
Kinexity |
» 2017-07-08 00:34:16 Trochę pozwoliłem sobie poprawić: #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>... |
|
mokrowski |
» 2017-07-08 00:49:19 Poprawka minimalna, algorytm nie jest optymalny: #include <string> #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 ); 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? |
|
« 1 » |