PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C-Problem] Überschreiben einer Variable


D4ve
2006-05-21, 00:07:48
Hallo,
ich sitze grade an einem Problem: Ich will einen String an eine Funktion übergeben und dort den Inhalt überschreiben. Leider wird der String aber nur innerhalb der Funktion überschrieben, nicht aber in der main(), dort bleibt der Inhalt so wie vorher.
Das Listing:

#include <stdio.h>
#include <string.h>

#define TEXT "Teststring1=Ein Teststring/Teststring2=Ein anderer Teststring"


char *splitstr(char *oldstr){

int pos1=strcspn(oldstr,"=")+1;
int pos2=strcspn(oldstr,"/");
int i,j;
char *newstr=(char *)malloc(pos2-pos1+1); /*der Substring*/
char *buf=(char *)malloc(strlen(oldstr)-pos2+1); /*Pufferstring*/

/*Part zwischen Pos1 und 2 in newstring schreiben*/
for(i=pos1,j=0;i<pos2;i++,j++)
newstr[j]=oldstr[i];

newstr[j]='\0';

/*Reststring in Puffer schreiben*/
for(i=0;oldstr[pos2]!='\0';pos2++,i++)
buf[i]=oldstr[pos2+1];

/*free(oldstr);*/ /*--> FÜHRT ZU FEHLER*/
oldstr=(char *)malloc(strlen(buf)+1);
oldstr=buf;

/*Testausgabe der einzelnen Stringinhalte*/
printf("\n%s\n%s\n%s",newstr,buf,oldstr);

free(buf);

return newstr;
}

void main() {
char *str;
char *substr1;

str=(char *)malloc(strlen(TEXT)+1);

sprintf(str,"%s",TEXT);

substr1=splitstr(str);
printf("\n str nach splitstr():\n%s",str);/*sieht genauso aus wie vorher*/
printf("\nSubstring1:\n%s",substr1);
getc(stdin);
}


Im Prinzip wird ein String an die splitstr-Funktion übergeben (str=oldstr), nach den Zeichen '=' und '/' aufgetrennt und soll dann neu geschrieben werden. Das return gibt nur den von den Zeichen eingegrenzten Teil zurück.
In der main() will ich den String also in Substrings zerlegen (substr1=splitstr(str); substr2=splitstr(der neue verkürzte String); ).
Aber in der splitstr-Funktion sorgt der Aufruf free(oldstring) für einen Absturz.
Ansich greife ich ja direkt auf den Zeiger zu, also müsste es doch auch klappen.
Ich wäre für einen Tipp sehr dankbar.

ScottManDeath
2006-05-21, 01:41:41
D4ve[/POST]']Hallo,
ich sitze grade an einem Problem: Ich will einen String an eine Funktion übergeben und dort den Inhalt überschreiben. Leider wird der String aber nur innerhalb der Funktion überschrieben, nicht aber in der main(), dort bleibt der Inhalt so wie vorher.
Das Listing:

#include <stdio.h>
#include <string.h>

#define TEXT "Teststring1=Ein Teststring/Teststring2=Ein anderer Teststring"


char *splitstr(char **oldstr){

int pos1=strcspn(*oldstr,"=")+1;
int pos2=strcspn(*oldstr,"/");
int i,j;
char *newstr=(char *)malloc(pos2-pos1+1); /*der Substring*/
char *buf=(char *)malloc(strlen(*oldstr)-pos2+1); /*Pufferstring*/

/*Part zwischen Pos1 und 2 in newstring schreiben*/
for(i=pos1,j=0;i<pos2;i++,j++)
newstr[j]=*oldstr[i];

newstr[j]='\0';

/*Reststring in Puffer schreiben*/
for(i=0;*oldstr[pos2]!='\0';pos2++,i++)
buf[i]=*oldstr[pos2+1];

/*free(oldstr);*/ /*--> FÜHRT ZU FEHLER*/
*oldstr=(char *)malloc(strlen(buf)+1);
strcpy(oldstr,buff);
//oldstr=buf;

/*Testausgabe der einzelnen Stringinhalte*/
printf("\n%s\n%s\n%s",newstr,buf,*oldstr);

free(buf);

return newstr;
}

void main() {
char *str;
char *substr1;

str=(char *)malloc(strlen(TEXT)+1);

sprintf(str,"%s",TEXT);

substr1=splitstr(&str);
printf("\n str nach splitstr():\n%s",str);/*sieht genauso aus wie vorher*/
printf("\nSubstring1:\n%s",substr1);
getc(stdin);
}


Im Prinzip wird ein String an die splitstr-Funktion übergeben (str=oldstr), nach den Zeichen '=' und '/' aufgetrennt und soll dann neu geschrieben werden. Das return gibt nur den von den Zeichen eingegrenzten Teil zurück.
In der main() will ich den String also in Substrings zerlegen (substr1=splitstr(str); substr2=splitstr(der neue verkürzte String); ).
Aber in der splitstr-Funktion sorgt der Aufruf free(oldstring) für einen Absturz.
Ansich greife ich ja direkt auf den Zeiger zu, also müsste es doch auch klappen.
Ich wäre für einen Tipp sehr dankbar.

noid
2006-05-21, 12:07:55
kleiner hinweis: ein char* ist eben ein zeiger auf das erste char einer zeichenkette.
wenn du den char* selbst verändern willst, dann must du einen zeiger auf char* setzen(also char**), weil der zeiger auch nur bei funktionsaufruf kopiert wird und du damit höchstens den inhalt aber nicht den zeiger verändern kannst.

hoffe das ist klar ausgedrückt ,)

D4ve
2006-05-21, 13:31:42
Vielen Dank für den Tipp, bin natürlich wieder mal nicht auf die Idee gekommen, dass ich einen Zeiger auf Zeiger brauche...wieder was dazu gelernt :D.

Allerdings funktioniert

for(i=pos1,j=0;i<pos2;i++,j++)
newstr[j]=*oldstr[i];

nicht, da wird wohl auf einen falschen Speicherbereich zugegriffen, das Resultat ist ein Absturz.
Habe mir jetzt schlicht damit geholfen, vor der for-Schleife *oldstr mit strcpy in einen weiteren Pufferstring zu kopieren. Nicht optimal, aber es funktioniert ;).

Nochmals vielen Dank für eure Mühe :)!!!

noid
2006-05-22, 17:20:08
newstr[j]=(*oldstr)[i];

sollte es tun. hab es nicht getestet - aber was sagt dir denn dein debugger? X-D

D4ve
2006-05-24, 20:14:14
noid[/POST]']newstr[j]=(*oldstr)[i];

sollte es tun. hab es nicht getestet - aber was sagt dir denn dein debugger? X-D

Damit klappts :). Ohne die Klammern blieb er mit der Meldung stehen: Unbehandelte Ausnahme bei 0x00411f49 in test.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000094.

Nochmal vielen Dank, hab wieder was dazu gelernt.