Seite 1 von 1

struct --> array --> pointer

Verfasst: Sa Jun 06, 2009 12:17 pm
von SeriK00
Hallo Leute,
ich habe folgendes Problem:
Es werden drei elemente nacheinander in array eingelesen und in die struct person eingefügt.
In der Funktion: void array_schreiben(char *pointer, person pers) will ich alle drei Elemente auf die adresse von pointer schreiben (pointer verweist ja auf array).
Hinterher soll sowas rauskommen: (100NameVorname).

Also ich schreibe ID und erhöhe den Pointer um Größe von ID usw.
Das klappt leider nicht.
Ich weiß, das man das Problem schlicht durch strcat lösen kann, ich will aber den Umgang mit Pointer erlernen.

vielen Dank im Voraus.

Code: Alles auswählen

#include "stdafx.h"
#define SIZE 10

typedef struct person
{
	int id;
	char vorname [SIZE];
	char nachname [SIZE];
};

void array_schreiben(char *pointer, person pers);

char array[100];

int _tmain(int argc, _TCHAR* argv[])
{

	person pers;

	puts("\nBitte ID eingeben: ");
	gets(array);
	pers.id = atoi(array);
	printf("\n%d", pers.id);
	
	puts("\nBitte VORNAME eingeben :");
	gets(array);
	strcpy(pers.vorname, array);
	puts(pers.vorname);

	puts("\nBitte NACHNAME eingeben :");
	gets(array);
	strcpy(pers.nachname, array);
	puts(pers.nachname);

	array_schreiben(array, pers); //array ist ein Zeiger auf ein char array

	return 0;
}

void array_schreiben(char *pointer, person pers)
{
	char ram[4];
	itoa(pers.id, ram, 10);
	strcpy(pointer, ram);
	pointer+=pointer+sizeof(pers.id);		//pointer um die größe des Elements pers.id erhöhen
	
	strcpy(pointer, pers.vorname);			//pointe muss eingentlich auf die 1. Adresse anch pers.id zeigen tut er aber nicht
	printf("\n Adresse vom pointer %p", pointer);
	pointer+=sizeof(pers.vorname);			//pointer um die größe des Elements pers.vorname erhöhen	

	strcpy(pointer, pers.nachname);
	pointer+=sizeof(pers.nachname);

	printf("\n%s", array);                                   
	printf("\n%s", pointer);                        //Hier sollen alle drei Eingaben hintereinander stehen
}

Re: struct --> array --> pointer

Verfasst: Sa Jun 06, 2009 12:29 pm
von Dirty Oerti
Dein Problem liegt beim sizeof, würde ich mal sagen :)
sizeof gibt dir die Größe an, die dein "Objekt", was du ihm gibst, in Byte hat.

Gibst du also einen Integer (Pers.Id) an, dann wirst du als "Antwort" 4 Byte bekommen, denn so groß ist nunmal ein Integer.
Du willst aber die "Länge des Strings", den dieser Integer ergibt. Dazu benutzt du str_lenght (oder so ähnlich).
Und zwar benutzt du diese Funktion nicht mit deinem Integer, sondern mit dem Char-String (in dem Fall "ram").

Genauso solltest du es auch bei den anderen Elementen von Pers machen, da es sich ja immer um einen String handelt.

Re: struct --> array --> pointer

Verfasst: Sa Jun 06, 2009 1:10 pm
von cloidnerux
Was mir ncoh aufgefallen ist: Du hast sehr kleine größen für diene Arrays z.B im Struct.
Sobald jemand mehr als 10 Buchstaben eingibt, läuft der Array über und Fehler.

Re: struct --> array --> pointer

Verfasst: Sa Jun 06, 2009 2:24 pm
von Kerli
SeriK00 hat geschrieben: pointer+=pointer+sizeof(pers.id); //pointer um die größe des Elements pers.id erhöhen
Irgendwas passt da wohl nicht, oder? Überleg doch einmal was denn der '+='-Operator macht... ;)
Dirty Oerti hat geschrieben:Du willst aber die "Länge des Strings", den dieser Integer ergibt. Dazu benutzt du str_lenght (oder so ähnlich).
Genau, nur das die Funktion strlen heißt: http://tutorial.proggen.org/doku.php?id ... ing:strlen

Re: struct --> array --> pointer

Verfasst: So Jun 07, 2009 3:35 pm
von SeriK00
Hallo und Vielen Dank,
pointer+=pointer+sizeof(pers.id);
Mit deisem Befeht wollte ich den pointer um die Größe von int, also vier erhöhen.
Stimmt das den nicht?

Ich benutze jetzt strlen, das klappt so weit ganz gut.
Allerdings möchte ich eine Leerstelle zwischen Elementen einfügen.
Warum klappt das nicht?


Code: Alles auswählen

#include "stdafx.h"

#define SIZE 100

void array_schreiben(char *pointer, person pers);
char array[SIZE];

int _tmain(int argc, _TCHAR* argv[])
{

	person pers;

	puts("\nBitte ID eingeben: ");
	gets(array);
	pers.id = atoi(array);
	printf("%d", pers.id);
	
	puts("\nBitte VORNAME eingeben :");
	gets(array);
	strcpy(pers.vorname, array);
	puts(pers.vorname);

	puts("\nBitte NACHNAME eingeben :");
	gets(array);
	strcpy(pers.nachname, array);
	puts(pers.nachname);

	array_schreiben(array, pers);					//array ist ein Zeiger auf ein char array

	return 0;
}

void array_schreiben(char *pointer, person pers)
{
	int a,b,c;
	char ram[4];
	itoa(pers.id, ram, 10);
	strcpy(pointer, ram);
	a = strlen(ram);
	printf("\npointer von a vor :%p", pointer);
	pointer+=strlen(ram)+1;
	printf("\npointer von a nach :%p", pointer);
	
	strcpy(pointer, pers.vorname);			
	b = strlen(pers.vorname);			
	printf("\npointer von a vor :%p", pointer);
	pointer+=strlen(pers.vorname)+1;
	printf("\npointer von a nach :%p", pointer);

	strcpy(pointer, pers.nachname);
	c = strlen(pers.nachname);
	printf("\nointer von a nach :%p", pointer);
	pointer+=strlen(pers.nachname)+1;
	printf("\npointer von a nach :%p", pointer);

	printf("\na=%d,b=%d,c=%d", a,b,c);
	printf("\n%s", array);
}

Re: struct --> array --> pointer

Verfasst: So Jun 07, 2009 6:46 pm
von Kerli
SeriK00 hat geschrieben:pointer+=pointer+sizeof(pers.id);
Mit deisem Befeht wollte ich den pointer um die Größe von int, also vier erhöhen.
Stimmt das den nicht?
Nein stimmt nicht :) Du erhöhst den Wert von pointer nämlich um den eigenen Wert und die Grö0e von int...
Also entweder du schreibst

Code: Alles auswählen

pointer += sizeof(pers.id);
oder

Code: Alles auswählen

pointer = pointer + sizeof(pers.id)
Wobei die erste Möglichkeit natürlich zu bevorzugen ist, da ja für genau so etwas der += Operator definiert wurde. Was ich gesehen hab hast du das im aktuellen Code aber eh nicht mehr drinnen.
SeriK00 hat geschrieben:Allerdings möchte ich eine Leerstelle zwischen Elementen einfügen.
Warum klappt das nicht?
Du solltest sie auch ins Array schreiben ;) Also an die entsprechenden Stellen ein Leerzeichen reinschreiben. zb so:

Code: Alles auswählen

pointer+=strlen(ram);
*pointer = ' '; // Leerzeichen schreiben
++pointer; // und Zeiger weiterbewegen