instrukcja strncpy zwraca na końcu stringa dziwne znaki
Ostatnio zmodyfikowano 2016-08-29 07:03
latajacaryba Temat założony przez niniejszego użytkownika |
instrukcja strncpy zwraca na końcu stringa dziwne znaki » 2016-08-24 23:55:31 Witam. Zrobiłem program żeby przetestować działanie strncpy i wyszło mi coś takiego: #include <iostream> #include <string.h> using namespace std; int main() { char tab[] { "tutaj siedzi sobie napis" }; char tab2[ 50 ]; char tab3[ 50 ]; strcpy( tab2, tab ); strncpy( tab3, tab2, 7 ); cout << "tablica 1 " << tab; cout << endl << "tab2 " << tab2 << endl; cout << " i tab 3 " << tab3; return 0; }
Wynik to: Tablica 1 tutaj siedzi sobie napis tab 2 tutaj siedzi sobie napis tab 3 tutaj s(i tutaj dalej są dziwne znaki, których niestety nie mogę wypisać) Przekształciłem troche program i coś zauważyłem: #include <iostream> #include <string.h> using namespace std; int main() { char tab[] { "tutaj siedzi sobie napis" }; char tab2[ 50 ]; char tab3[ 50 ]; strncpy( tab3, tab, 7 ); cout << "tablica 1 " << tab; cout << " i tab 3 " << tab3; return 0; }
teraz po usunięciu wynik wyglądał tak: Tablica 1 tutaj siedzi sobie napis i tab 3 tutaj s czyli poprawnie, bez dodatkowych znaków. Postanowiłem dodać <<endl na końcu cout << "tablica 1 " << tab; aby napis był w dwóch liniach i wtedy znów się wykrzaczyło: Tablica 1 tutaj siedzi sobie napis i tab 3 tutaj s(i dziwne znaki) Co ciekawe, znaki za każdym razem są takie same. Z góry dzięki za pomoc. |
|
michal11 |
» 2016-08-25 00:12:28 Wystarczy przeczytać dokumentację funkcji strncpy()Jest tam jasno napisane, że No null-character is implicitly appended at the end of destination if source is longer than num. |
Dlatego dostajesz losowe znaki, ponieważ tab3 nie jest poprawnym c-stringiem. Wystarczy dodać: strncpy( tab3, tab2, 7 ); tab3[ 7 ] = '\0';
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-08-25 00:37:28 hmmm... to dziwne, bo w książce był taki przykład: #include <iostream> using namespace std; #include <cstring>
int main() { char tekst[] = { "uwaga, tarcza zostala przepalona" }; char komunikat[ 120 ]; strcpy( komunikat, tekst ); cout << komunikat << endl; strncpy( komunikat, "1234567890abcdef", 9 ); cout << komunikat; }
i tu działa autor nie wpisywał tab[x]='null'; |
|
michal11 |
» 2016-08-25 12:32:40 Sprawdzałeś ? U mnie ten program daje taki output: uwaga, tarcza zostala przepalona 123456789rcza zostala przepalona
Edit. i link do ideone: https://ideone.com/eOzs9j |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-08-26 02:11:52 No właśnie o to mi chodzi - autor nie dodał na końcu znaku null i wszystko działało. |
|
Gibas11 |
» 2016-08-26 02:21:50 Gdzie działało? Z tego co widzę to nie bardzo. :P |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-08-26 21:52:47 u mnie i u Michała11 działało. To przykład z mojego drugiego wpisu: "hmmm... to dziwne, bo w książce był taki przykład: " i po dwukropku jest przykład. |
|
michal11 |
» 2016-08-26 23:38:53 No przecież ci pokazałem, że nie działa. Ta linijka strncpy( komunikat, "1234567890abcdef", 9 ); oznacza, że chcesz skopiować 9 znaków ze stringa 1234567890abcdef do c-stringa komunikat. Czyli w wyniku tego w komunikat powinno być 123456789 a zamiast tego otrzymujesz 123456789rcza zostala przepalona czyli ewidentnie coś jest nie tak. Zresztą spróbuj odpalić taki program i napisz co on wypisuje: #include <iostream> using namespace std; #include <cstring>
int main() { char tekst[] = { "uwaga, tarcza zostala przepalona" }; char komunikat[ 120 ]; cout << komunikat << endl; strncpy( komunikat, "1234567890abcdef", 9 ); cout << komunikat << endl; }
|
|
« 1 » 2 |