30. september 2004 - 17:47
Der er
39 kommentarer og 1 løsning
Ændre i indholdet af en char*
Da jeg er utålmodig sidder jeg og roder med
http://www.eksperten.dk/spm/545465 men er stødt på et lille problem.
For nu at fjerne det overflødige kode så har jeg basalt set en funktion ala:
void doStuff(char* source)
{
source[2] = '\0';
}
Men efter at have kaldt doStuff med eks:
char* src = "some string";
doStuff(src);
Er src stadig "some string" - det var jo meningen at char no 3 skulle være ændret...
Hvad går der galt for mig?
Annonceindlæg fra DE-CIX
30. september 2004 - 18:07
#1
du skal vel returnere den nye char* ? char* doStuff(char* source) { source[2] = '\0'; return source; } vil mit gæt være
30. september 2004 - 18:08
#2
så: char* src = "some string"; char* src2 = doStuff(src);
30. september 2004 - 18:15
#3
Hvad bliver der så af det oprindelige indhold af src? Vil jeg ikke ende med en kopi af src og dermed bruge dobbelt så meget hukommelse?
30. september 2004 - 18:19
#4
jo, men du kan jo nok også genbruge den vil jeg mene... char* src = "some string"; src = doStuff(src); måske? eller kan man nok slette den gamle src. Du kunne jo også ændre det lidt: char* doStuff(char* source) { source[2] = '\0'; return source; } char* src = doStuff("some string"); ved ikke helt om man kan på den måde, kan ikke teste det lige nu
30. september 2004 - 18:21
#5
Lad os så sige at jeg kører denne funktion en fantazillion gange - er der så ikke en måde at genbruge den oprindeligt allokerede hukommelse, så puteren slipper for at allokere/reallokere hukommelse en fantazillion gange?
30. september 2004 - 18:22
#6
eller skal du nok til noget pointer noget.. kan jeg ikke lige i hovedet... Men noget med at src har en adresse og det er så i den du ændrer. void doStuff(char* &source) { source[2] = '\0'; } char* src = "some string"; doStuff(src); men kan ikke lige huske det i hovedet... Kan ikke teste :(
30. september 2004 - 18:23
#7
så smider den adressen på src med, og det er så den du skal ændre i...
30. september 2004 - 18:23
#8
Der er ikk enoget galt med din funktion ! #include <stdio.h> void doStuff(char* source) { source[2] = '\0'; } int main() { char src[] = "some string"; printf("%s\n",src); doStuff(src); printf("%s\n",src); return 0; } virker fint hos mig !
30. september 2004 - 18:23
#9
Output: C:\>z some string so hvilket er korrekt. Så fejlen må ligge et andet sted.
30. september 2004 - 18:26
#10
den skal vel ikke udskrive "some string" den skal jo udskifte [2] med '\0' , så der kommer vel til at stå noget andet??
30. september 2004 - 18:26
#11
Arne >> Så fatter jeg ikke hvad der går galt... Kan det passe at '\0' ikke bliver tolket som en null-terminering når man udskriver med cout << src << endl; ?
30. september 2004 - 18:26
#12
Ahhh... ok... havde ikke set "so"
30. september 2004 - 18:27
#13
Prøv med printf istedet og se om det har noget med det at gøre?
30. september 2004 - 18:28
#14
#include <iostream> using namespace std; void doStuff(char* source) { source[2] = '\0'; } int main() { char src[] = "some string"; cout << src << endl; doStuff(src); cout << src << endl; return 0; } giver også: some string so
30. september 2004 - 18:29
#15
Mit gæt er at du lader en pointer pege på noget, som er korrekt, og så ændrer du det som pointeren peger på, og så er det forkert.
30. september 2004 - 18:30
#16
Poster lige den fulde source, da det tydeligvis ikke er teorien der fejler noget. Output: #0 [This is a test] #1 [is a test] #2 [a test] #3 [test] ** Anykey ** Burde (som jeg opfatter det) #0 this, #1 is etc etc etc #include <iostream> #include <stdlib.h> using namespace std; int Split(char* dest[10], char* src, unsigned int length, char splitChar, char strChar); int main(int argc, char *argv[]) { char* src = "This is a test"; char* items[10]; int idx, len; len = Split(items, src, strlen(src), ' ', '"'); for(idx = 0; idx < len; idx++) cout << "#" << idx << "\t[" << items[idx] << "]" << endl; cout << "\n\n\t** Anykey **" << endl; getchar(); return 0; } int Split(char* dest[10], char* src, unsigned int length, char splitChar, char strChar) { int loc; int idx = 1; bool esc = false; loc = 0; while(src[loc] == splitChar) loc++; if(src[loc] == strChar) { esc = true; loc++; } dest[0] = src + loc; for(loc++; loc < length; loc++) { if(!esc) { if(src[loc] == strChar) { esc = true; src[loc] == '\0'; dest[idx++] = src + loc + 1; } else if(src[loc] == splitChar) { src[loc++] == '\0'; while(src[loc] == splitChar) loc++; dest[idx++] = src + loc; } } else { if(src[loc] == strChar) { if(src[loc - 1] == '\\') continue; esc = false; src[loc++] = '\0'; while(src[loc] == splitChar) loc++; dest[idx++] = src + loc; } } } return idx; }
30. september 2004 - 18:30
#17
hehe skummelt... fejl i ram ?? :) hehe
30. september 2004 - 18:31
#18
. o O (Så skulle jeg alligevel have dokumenteret min kode) :( Hader når min bedrevidende indre stemme har ret!
30. september 2004 - 18:33
#19
Det kan da ikke være linjen dest[0] = src + loc; der opretter en kopi af src og gemmer pointeren i dest[0] ??
30. september 2004 - 18:36
#20
Jeg er slet ikke glad for den måde du bruger memory på.
30. september 2004 - 18:37
#21
Det må du meget gerne uddybe - sætter gerne point op, eller falder på knæ og kalder dig code-guru hvis det hjælper... hehe
30. september 2004 - 18:38
#22
hehe... arne du tager bare over :)
30. september 2004 - 18:42
#23
#include <iostream> #include <stdlib.h> using namespace std; int Split(char* dest[10], char* src, unsigned int length, char splitChar, char strChar); int main(int argc, char *argv[]) { char src[] = "This is a test \"hello world\""; char* items[10]; int idx, len; len = Split(items, src, strlen(src), ' ', '"'); for(idx = 0; idx < len; idx++) cout << "#" << idx << "\t[" << items[idx] << "]" << endl; cout << "\n\n\t** Anykey **" << endl; getchar(); return 0; } int Split(char* dest[10], char* src, unsigned int length, char splitChar, char strChar) { bool esc = false; int idx = 0; dest[idx] = src; idx++; for(int loc=0;loc<length;loc++) { if(src[loc] == splitChar && !esc) { src[loc] = '\0'; dest[idx] = src + loc + 1; idx++; } else if(src[loc] == strChar) { esc = !esc; } else { // nothing } } return idx; }
30. september 2004 - 18:42
#24
Output: C:\>zzzz #0 [This] #1 [is] #2 [a] #3 [test] #4 ["hello world"] ** Anykey **
30. september 2004 - 18:53
#25
for each(dummefejl in my_source) Så skal jeg bare finde ud af hvor...
30. september 2004 - 19:02
#26
Det løgn!! Jeg har bare IKKE skrevet == i stedet for = 100 steder...
30. september 2004 - 19:31
#27
Bemærk forskellen på disse to: char* src = "This is a test"; char src[] = "This is a test";
30. september 2004 - 19:33
#28
For god ordens skyld vil jeg lige poste slutresultatet... som endda er forholdsvist tilgivende overfor syntaxfejl :D #include <iostream> #include <stdlib.h> using namespace std; int Split(char* dest[10], char* src, unsigned int length, char splitChar, char strChar); int main(int argc, char *argv[]) { char src[] = "This is \"a test\"ok"; char* items[10]; int idx, len; len = Split(items, src, strlen(src), ' ', '\"'); for(idx = 0; idx < len; idx++) cout << "#" << idx << "\t[" << items[idx] << "]" << endl; cout << "\n\n\t** Anykey **" << endl; getchar(); return 0; } int Split(char* dest[10], char* src, unsigned int length, char splitChar, char strChar) { int loc; int idx = 1; bool esc = false; loc = 0; while(src[loc] == splitChar) loc++; if(src[loc] == strChar) { esc = true; loc++; } dest[0] = src + loc; for(loc++; loc < length; loc++) { if(!esc) { if(src[loc] == strChar) { esc = true; src[loc] = '\0'; dest[idx++] = src + loc + 1; } else if(src[loc] == splitChar) { src[loc] = '\0'; loc++; while(src[loc] == splitChar && loc < length) loc++; if(src[loc] == strChar) { esc = true; loc++; } if(loc < length) dest[idx++] = src + loc; } } else { if(src[loc] == strChar) { if(src[loc - 1] == '\\') continue; esc = false; src[loc++] = '\0'; while(src[loc] == splitChar && loc < length) loc++; if(loc < length) dest[idx++] = src + loc; } } } return idx; }
30. september 2004 - 19:33
#29
Ja det er lidt vigtigt. Nogle compilere vil putte den første streng i readonly memory, så når man forsøger at ændre strengen så ...
30. september 2004 - 19:34
#30
bertel >> Yup, havde jeg godt set :) Men det var desværre langt fra den eneste fejl... hehe. 4-5 dage med c++ og så har jeg allerede lært at lave SÅ mange fejl ;)
30. september 2004 - 19:35
#31
Kan man godt bruge malloc sammen med en char x[] ?
30. september 2004 - 19:36
#32
Never mind. Jeg afprøver det bare :)
30. september 2004 - 19:38
#33
nej malloc og new kræver en pointer
30. september 2004 - 19:48
#34
calloc så ? :) eller...
30. september 2004 - 19:49
#35
. o O (Føler mig som en komplet idiot efter at jeg har kastet mig over c++, men denne gang gi'r jeg ikke op)
30. september 2004 - 19:52
#36
char x[] = "..............."; er et fast array (C beregner bare selv længden). char *x; er en pointer og kan bruges med new/malloc/calloc etc..
30. september 2004 - 19:52
#37
char *x = "..............."; er en pointer til en konstant streng
30. september 2004 - 20:02
#38
Så hvis jeg laver en char *x = malloc(1024) og modtager fra winsock, så er jeg nød til at kopiere det over i en char y[] for at kunne bruge min split funktion ?
30. september 2004 - 20:03
#39
Nej. Fordi i det tilfælde peger pointeren på noget memory som godt kan opdateres.
30. september 2004 - 20:07
#40
Tilbage til tegnebrættet - tak for hjælpen alle :)
Kurser inden for grundlæggende programmering