Speicherzugriffsfehler beim Benutzen von strtok und strcpy

grandmetre

Mitglied
Hallo zusammen,

Vorab gesagt, es ist das erste mal, dass ich auf diese Weise mit Strings unter C arbeite.
Ich habe Probleme beim Benutzen von strtok in Kombination mit strcpy. Ich möchte einen String von Attributen wie

Code:
"value=312544;name=fred;id=179asd45;dataType=string;entityType=person"

so aufteilen, dass ich eine liste von structs in der Form

Code:
typedef struct attribute {
	string name;
	string value;
}attribute;

füllen kann.

ich gehe dabei wie folgt vor:

Code:
	char delims[] = ";";

	char *result = strtok(dataString, delims);


	int i;
	char *stringAttributes[numValues];
	initStringArray(stringAttributes, numValues);
	if(debug)printf("stringAttribute-Array initialized\n");

	for (i=0; result != NULL; i++){
		strcpy(stringAttributes[i], result);
		if(debug)printf("result \"%s\" must equal current result: %s\n", result, stringAttributes[i]);
		result = strtok( NULL, delims );//set the pointer in the strtok-funktion to the next delimiter
	}

	strcpy(delims, "=");


	if(debug)printf("copying values\n");
	for(i=0; i < numValues; i++){
		if(debug)printf("splitting the attribute\n");
		result = strtok(stringAttributes[i], delims);
		if(debug)printf("copying name: %s\n", result);
		strcpy(data[i].name, result);
		result = strtok(NULL, delims);
		if(result == NULL)continue; //for the case the string contains something like: dataType=int,name=;value=foobar
		if(debug)printf("copying value: %s\n", result);
		strcpy(data[i].value, result);
	}

und initStringArray sieht so aus:

Code:
int initStringArray(char *arr[], int arrLength){
	int i;
	char string[50*arrLength];

	for(i=0; i < arrLength; i++){
		arr[i] = &string[50*i];
		bzero(arr[i], 50);
	}
	return 0;
}

leider bekomme ich schon bei der Ausgabe: result "..." must be equal "....." unterschiedlicher ergebnisse.

woher kann das kommen? Oder gibts es eine viel elegantere Methode die Problemstellung zu lösen?

Danke schonmal für eure Antworten

Gruß grand
 
Hi.
und initStringArray sieht so aus:

Code:
int initStringArray(char *arr[], int arrLength){
	int i;
	char string[50*arrLength];

	for(i=0; i < arrLength; i++){
		arr[i] = &string[50*i];
		bzero(arr[i], 50);
	}
	return 0;
}
Also das kann so schonmal nicht funktionieren. Du verwendest eine temporäre Variable um das übergebene Array zu initialisieren. Die Variable wird aber nach Beenden der Funktion wieder vom Stack geräumt und dein Array enthält nur noch ungültige Zeiger. Sowas kann nur schiefgehen...

Du mußt schon explizit Speicher mit calloc oder malloc allozieren.

Da die strtok Funktion den übergebenen String verändert und \0 Zeichen dort einfügt, mußt du eigentlich gar keinen zusätzlichen Speicher benutzen, sondern kannst einfach gleich auf den Ursprungsstring zeigen lassen:
C:
struct attribute {
  const char* name;
  const char* value;
} data[50];

int i = 0;
data[i].name = strtok(dataString, "=");

while (data[i].name) {
  if (data[i].value = strtok(NULL, ";")) {
    i += 1;
  } else break;
  data[i].name = strtok(NULL, "=");
}
Gruß
 
Das sieht doch schon einmal etwas sauberer aus :)

Jetzt habe ich aber leider das Problem, dass ich in Zeile 7 einen Speicherzugriffsfehler bekomme. Diese Fehler waren auch der Grund, warum ich versucht habe auf verschiedene Arten die Strings zu initialisieren.

Wo könnte das her kommen?
 
dataString wird als Parameter übergeben und wird mit

Code:
char *dataString = "..................."

initialisiert.

Ich glaube eher, dass der Speicherzugriffsfehler daher kommt, dass man auf data[i].name zugreifen will.
 
Wenn du dataString so initialisiert hast, wie du das gezeigt hast, kann das nicht funktionieren. Hier wird nämlich ein char-Pointer erstellt und anschließend Speicher für "..................." reserviert. Und auf diesen Speicher zeigt dataString dann. Nur ist diese Zeichenkette (..................) konstant! Jeder Schreibzugriff darauf lässt dein Programm abstürzen und das ist das Problem.

Lg
 
Genau das wars. Ich danke euch beiden für eure Hilfe. Ihr habt mich auf den Pfad der Erleuchtung gebrach, zumindest was Strings betrifft ^^
 
Zurück