Avatar billede krismort Nybegynder
26. august 2002 - 10:29 Der er 3 kommentarer og
1 løsning

kopier string til string (ANSI C++)

Hvordan kan jeg kopierer en del af en string til en string i ANSI C++

Hvis jeg feks har disse 2 variabler
char navn[8];
char alder[8];
strcpy(navn, "Henry");
strcpy(alder, "48");

og jeg har kopieret dem til en string ved at gøre sådan:
char* tmp;
tmp = new char[sizeof(navn)+sizeof(alder)];
strcpy(tmp, navn);
strcat(tmp, alder);

Hvordan kopierer jeg så den data tilbage igen til navn / alder?
Det er jo nemt nok med navn ... der kan man bruge strcpy men strcpy tager ikke noget offset eller lign... findes der en lign function som tager offset som argument ? ... Eller skal jeg selv skrive en funktion til det ?

Kristian
Avatar billede soepro Nybegynder
26. august 2002 - 12:06 #1
New du kan bruge strncpy til det. Husk på at strncpy som første parm tager en pointer til det første tegn. Du kan derfor gøre sådan her:

strncpy(navn, tmp, sizeof(navn)-1);
strncpy(alder, tmp+sizeof(navn)-1, sizeof(alder)-1);

Husk at char[8] betyder at der kan være 7 tegn + nul-terminering i feltet - derfor vil sizeof() -1 give det maksimale antal tegn der må kopieres.
Avatar billede soepro Nybegynder
26. august 2002 - 12:12 #2
Hvor kom New fra - der skal stå 'Nej' (du skal ikke selv lave en funktion.)Ovenstående kræver selvfølgelig at navn rent faktisk indeholder 8 tegn - ellers vil alder jo ikke starte 8 tegn inde i tmp. Hvis du vil være helt sikker, skal du indsætte et separatortegn mellem navn og alder, sådan at du har noget at "dele" strengen med. Du kan anvende sprintf() til begge dele:

sprintf(temp, "%*.*s;%*.*s", sizeof(navn-1), sizeof(navn)-1, navn,           
                            sizeof(alder)-1, sizeof(alder)-1, alder); // tmp indeholder nu f.eks. "Hans;23"

// Så splitter vi strengen igen vha. ';'
sprintf(navn, "%.*s", sizeof(navn)-1, strtok(tmp, ";"));
sprintf(alder, "%.*s", sizeof(alder)-1, strtok(NULL, ";"));
Avatar billede krismort Nybegynder
26. august 2002 - 13:57 #3
Fandt entligt ud af at man kan gøre det på den her måde men din ide er faktisk ganske udemærket jeg er bare ikke glad for delimiters, har engang brugt den løsning men der opstod problemer. 

class PacketLogin : public packet
{
private:
    char* uname;
    char* passw;
public:
    PacketLogin(char* name, char* pass)
    {
        ID = 1;
        uname = new char[strlen(name)];
        passw = new char[strlen(pass)];

        strcpy(uname,name);
        strcpy(passw,pass);

        //Serialize -> packet.data
        memcpy(((char*)data),&ID, sizeof(ID));
        memcpy(((char*)data)+sizeof(ID),uname, strlen(uname));
        memcpy(((char*)data)+sizeof(ID)+strlen(uname),passw, strlen(passw));
        data[(sizeof(ID)+strlen(uname)+strlen(passw))] = '\0';
    };
};

Man skal så lige huske på at passw & uname skal være af bestemt/kendt størrelse når man deserialiserer ellers går det galt hvis ikke man kender størrelsen af dem så er din metode jo helt eminent. Har jeg ret ?

Kristian
Avatar billede soepro Nybegynder
26. august 2002 - 15:23 #4
memcpy og strncpy virker på mange måder ens - strncpy stopper blot ved første '\x0' - så jo du har ret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester