Permalänk
Medlem

c++ new char[] Í ?

Har gjort en DLL i vc++ som jag injecerar i en applikation. Sen använder jag NamedPipes för att prata med den från min egna applikation.
Så jag skickar in en "command string" som jag ska plocka isönder och skapa upp mindre strängar som jag använder inne i min DLL sen.

Men när jag räknat ut att tex min första "commandstring" är 5 tecken lång och gör följande

char *tmp = new char[length]; där length är 5. Får jag en char array som ser ut såhär

ÍÍÍÍÍýýýý alltså 9 tecken lång? Faktum är att alla nya char arrays jag gör består av en massa Í. Vad är det här? Varför? osv.. försökt googla på det men vet inte riktigt vad jag ska söka på. Fattar verkligen ingenting.

Vad jag försöker uppnå är att om jag får in en stäng från min applikation som ser ut nåt i stil med

"text, hopp, kastrull". Så vill jag skapa upp 3 char arrays, en för varje ord. Med exakt rätt längd och spara i en vektor. Så jag sen kan använda dem.

Förstår inte att något så simpelt ska vara så svårt. Någon som kan tänkas hjälpa till här? Tack på förhand.

Permalänk
Medlem

Re: c++ new char[] Í ?

Citat:

Ursprungligen inskrivet av zener

char *tmp = new char[length]; där length är 5. Får jag en char array som ser ut såhär

ÍÍÍÍÍýýýý alltså 9 tecken lång? Faktum är att alla nya char arrays jag gör består av en massa Í. Vad är det här? Varför? osv.. försökt googla på det men vet inte riktigt vad jag ska söka på. Fattar verkligen ingenting.

Hur fyller du arrayerna? Lite mer kod skulle vara trevligt att se.

Permalänk
Medlem

std::vector<char*> commandStrings; int stringLen = 0; for(int i = 0; i < strlen(cmd); i++) { if(cmd[i] == ' ') { char *tmp = new char[stringLen]; int k = i; for(int j = stringLen-1; j >= 0; j--) tmp[j] = cmd[--k]; commandStrings.push_back(tmp); stringLen = 0; } else if(cmd[i] == '=') { break; } else stringLen++; }

cmd är min sträng som jag får in med NamedPipes. Om den är tex
"sText Tmp = Run();" Så vill jag få in två char arrays i min CommandStrings. Med sText och Tmp.

char *tmp = new char[stringLen];
ger mig en chararray som ser ut ÍÍÍÍÍýýýý när jag har stringLen = 5. (för sText)
och när den sen är fylld så ser den ut såhär
sTextýýýý

Vilket inte fungerar senare....De där ýna vill jag inte riktigt ha med..

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av zener

Vilket inte fungerar senare....De där ýna vill jag inte riktigt ha med..

Ok, en C-sträng måste ju avslutas med ett noll-tecken, vilket du inte gör. Så när du skriver ut strängen så vet inte utskriftsfunktionen när strängen slutar, utan kör på tills den hittar ett noll-tecken någonstans i minnet. Så du får öka storleken på varje sträng du allokerar med ett och avsluta strängen med '0'. Eller så använder du C++-strängar istället, så slipper du alla problem med minneshantering och avslutning av strängarna.

C++-exempel (varning, otestad kod):

// Skapa en ny sträng från C-strängen. std::string command(cmd); // Hitta första och andra mellanslaget i strängen size_t first_space = command.find(' '); size_t second_space = command.find_first_of(' ', first_space + 1); // Plocka ut strängarna std::string first_str = command.substr(0, first_space); std::string second_str = command.substr(first_space + 1, second_space - first_space);

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av perost
Ok, en C-sträng måste ju avslutas med ett noll-tecken, vilket du inte gör. Så när du skriver ut strängen så vet inte utskriftsfunktionen när strängen slutar, utan kör på tills den hittar ett noll-tecken någonstans i minnet. Så du får öka storleken på varje sträng du allokerar med ett och avsluta strängen med '0'. Eller så använder du C++-strängar istället, så slipper du alla problem med minneshantering och avslutning av strängarna.

C++-exempel (varning, otestad kod):

// Skapa en ny sträng från C-strängen. std::string command(cmd); // Hitta första och andra mellanslaget i strängen size_t first_space = command.find(' '); size_t second_space = command.find_first_of(' ', first_space + 1); // Plocka ut strängarna std::string first_str = command.substr(0, first_space); std::string second_str = command.substr(first_space + 1, second_space - first_space);

Ah det hade jag helt glömt bort.. C# kodare här ^^..
la bara på
new char[stringLen+1]. Sen efter
tmp[stringLen] = '\0';
Funkar klockrent nu!

Tack ska du ha!