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

instrukcja strncpy zwraca na końcu stringa dziwne znaki

Ostatnio zmodyfikowano 2016-08-29 07:03
Autor Wiadomość
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:
C/C++
#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:
C/C++
#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.
P-151075
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ć:
C/C++
strncpy( tab3, tab2, 7 );
tab3[ 7 ] = '\0';
P-151077
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:
C/C++
#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;
    //dalsza nieważna część kodu.
}
i tu działa autor nie wpisywał tab[x]='null';
P-151083
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
P-151092
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.
P-151122
Gibas11
» 2016-08-26 02:21:50
Gdzie działało? Z tego co widzę to nie bardzo. :P
P-151123
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.
P-151133
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:
C/C++
#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 << endl;
    //dalsza nieważna część kodu.
}
P-151137
« 1 » 2
  Strona 1 z 2 Następna strona