Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

memcpy problem - dodaje proizvoljne karaktere na kraj destination niza

[es] :: C/C++ programiranje :: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza

[ Pregleda: 1722 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pera Pisar

Član broj: 33427
Poruke: 18
*.static.sbb.rs.



Profil

icon memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 14:16 - pre 189 meseci
Imam problem sa memcpy naredbom u C++u.

Ne uspeva da tačno prekopira sadržaj jednog niza u drugi.

Prvo se alocira prostor za destination niz, a onda se izvršava memcpy:
Code:

char* destination= new char[/*duzina source niza*/];
memcpy(destination, source, /*duzina source niza*/);

Pre toga sam ispisao sadržaj source niza i njegovu dužinu. Kada ispišem destination, posle sadržaja koji treba da bude u njemu, dodaje se nekoliko proizvoljnih karaktera. U čemu je problem? To treba da bude tako jednostavno, a ne funkcioniše. Pokušao sam sa svim mogućim varijantama koje su mi pale na pamet (različite dužine niza, zatim sam sam implementirao svoju memcpy funkciju i sl.), ali ništa nije uspelo.

Jel ima neko ideju? Hvala



 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 14:50 - pre 189 meseci
Najverovatnije nisi iskopirao NULL ('\0') terminator kraja stringa.

Drugim rečima, ti si uradio sledeće:
Imaš SOURCE string "abcd" što je 4 bajta teksta (a interno ima 5 jer je poslednji element NULL).
Alocirao si 4 bajta za DESTINATION string.
Iskopirao si 4 bajta iz SOURCE i DESTINATION, ali nigde nemaš NULL terminator stringa, pa ni funkcija za određivanje ne zna gde je tom stringu kraj, već ide do prvog NULL-a u memoriji.

NULL terminator mozes i rucno da upises na poslednjoj poziciji, sto ti odmah govori da alokacija mora biti za jedan znak veca.

char* destination= new char[/*duzina source niza + 1*/];
memcpy(destination, source, /*duzina source niza*/);
destination[/*duzina source niza*/] = '\0';

... ili da iskopiras taj NULL zajedno sa stringom:

char* destination= new char[/*duzina source niza + 1*/];
memcpy(destination, source, /*duzina source niza + 1*/);
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 14:52 - pre 189 meseci
Fali ti 0 na kraju stringa. Funkcije koje ispisuju sadrzaj C stringova pretpostavljaju da se string zavrsava sa 0.

Dakle:

Code:
char* destination= new char[/*duzina source niza*/ + 1];
memset(destination,0,/*duzina source niza*/ + 1);
memcpy(destination, source, /*duzina source niza*/);



Tko leti vrijedi
 
Odgovor na temu

Pera Pisar

Član broj: 33427
Poruke: 18
*.static.ikomline.net.



Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 21:53 - pre 188 meseci
"Elementary my dear Watson"

Hvala na odgovorima. U pravu ste.

Što je najgore, na početku sam tako slično i uradio, tj. alocirao sam jedan bajt više, međutim ništa nisam upisao u njega. Posle sam, pošto to nije radilo, prebacio na alokaciju tačnog broja bajtova.

Citat:
Fali ti 0 na kraju stringa. Funkcije koje ispisuju sadrzaj C stringova pretpostavljaju da se string zavrsava sa 0.
A šta kada je nula regularan član niza? Kako onda kompajler zna da li je terminalni karakter ili nije?

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 21:58 - pre 188 meseci
Pogledaj negde ASCII tabelu i napravi razliku izmedju znaka nula ('0') koji ima ASCII broj 48, i nule koja je baš prava nula i ovako se beleži: '\0'

"Elementary my dear Watson" ;)
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 21:59 - pre 188 meseci
kompajler nema sa time nikakve veze. Radi se o tome kako su implementirane sve funkcije koje operisu sa C stringovima. Sve te funkcije pretpostavljaju da se string zavrsava kada se naidje na prvu 0 bez obzira gde to bilo.


Tko leti vrijedi
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza14.10.2008. u 22:05 - pre 188 meseci
A ako baš hoćeš da manipulišeš blokovima podataka koji zaista sadrže i 'prave' nule, onda više ne koristiš tzv null-terminated funkcije jer one polaze od pretpostavke nule kao kraja nečega, već neke druge tehnike među kojima je i ta memcpy funkcija koju si pokazao. Drugim rečima, o granicama moraš da vodiš računa uglavnom sam, sem ako koristiš neke stream klase koje interno beleže poziciju, ali to je već neka druga priča...

 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.113.*



+7 Profil

icon Re: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza16.10.2008. u 10:28 - pre 188 meseci
Nizove zavrsene sa nulom mozes da kopias i ovako
Code:

while(*(out++)=*(in++))
        ;

Code:

#include <iostream>
using namespace std;

int main()
{
    char* nizA="Ovo je niz";
        char*nizB=new char[strlen(nizA)+1];

    //do nule
    char* in=nizA; char* out=nizB;
    while(*(out++)=*(in++))
        ;
    //
    cout << nizB << endl;

    memset(nizB,0,strlen(nizA)+1);

    //neki broj bajtova
    in=nizA; out=nizB; int ln=strlen(nizA)+1;
    while(ln--)
        *(out++)=*(in++);
    //
    cout << nizB << endl;

    //
    delete[] nizB;
    return 0;
}

 
Odgovor na temu

[es] :: C/C++ programiranje :: memcpy problem - dodaje proizvoljne karaktere na kraj destination niza

[ Pregleda: 1722 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.