[C++] vergrößerung eines arrays

Tobias K.

Erfahrenes Mitglied
moin

wie schaffe ich es aus einen:
char text[20]

ein:
text[40]

zu machen??

ich hab schon was von alloc und ähnlichem gehört, ich hab aber noch keine vernümpftigen erklärungen oder beispiele gefunden.


umbrasaxum
 
Arraygrössen ändern geht gar nicht.
Du musst ein neues Array erstellen, den Inhalt vom Alten reinkopieren und dann das Alte löschen.
 
realloc()

Hi

Ich glaube du meinst die realloc() funktion
prototyp:

void *realloc(void *zgr, size_t newsize)

damit kannst du einen array vergroessern.

MFG Azmodeus
 
ich hab mir jetzt mir jetzt überlegt eine variable vom typ "CString" zu nehmen. wenn man dann ein zeichen an die variable dran hängt wird sie automatisch vergrössert (glaub ich).


umbrasaxum
 
stimmt, "CString" macht das automatisch dynamisch...ist aber soweit ich weiss eine M$-Klasse und nur im VisualC++ verfügbar. oder? eine andere Möglichkeit wäre es mittels Pointer&realloc zu machen. Das funktioniert folgendermaßen:


1. du definierst ein array:

//so:
char text[20];
//oder so:
char *text;
text = (char *) malloc (20*sizeof(char));


2. du verlängerst das array mittels realloc:

text = (char *) realloc(text, 40*sizeof(char));


vóila, du hast einen längeren string...
 
Ich habe das mal probiert, und so gut es geht versucht umzusetzen. Könnt ihr mir vielleicht erklären was daran falsch ist? Danke im vorraus!

Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main()
{
	int a=1, c=0;

	typedef struct
	{
		char Name[31];
		int Tag;
		int Monat;
		int Jahr;
		int PLZ;
		char Ort[31];
	}Person;

	Person *Daten;
		
		
	FILE *datei;

	if((datei=fopen("datei.dat","r"))==NULL)
	{
		datei=fopen("datei.dat","w");
		fclose(datei);
	}

	datei=fopen("datei.dat","w");


	do
	{
		printf("Name: ");
		scanf("%s",Daten[a].Name);
		fflush(stdin);

		if(Daten[a].Name==0)
		{
			a=0;
		}
		else
		{
			printf("Tag: ");
			scanf("%d",&Daten[a].Tag);
			fflush(stdin);

			printf("Monat: ");
			scanf("%d",&Daten[a].Monat);
			fflush(stdin);

			printf("Jahr: ");
			scanf("%d",&Daten[a].Jahr);
			fflush(stdin);

			printf("PLZ: ");
			scanf("%d",&Daten[a].PLZ);
			fflush(stdin);

			printf("Ort: ");
			scanf("%s",Daten[a].Ort);
			fflush(stdin);

			c=c+1;
		}
		if(c>=2)
		{
			Daten = (Person *) malloc (c*sizeof(Person));
		}

	}
	while(a!=0);

	fwrite(Daten,sizeof(Daten),1,datei);

	fclose(datei);

	printf("Gespeichert");
	getch();
	fflush(stdin);
	system("cls");

	printf("Geöffnet");
	getch();
	fflush(stdin);
	system("cls");

	datei=fopen("datei.dat","r");
	fread(Daten,sizeof(Daten),1,datei);

	for(int b=0;b<=c;b++)
	{
		printf("Name: %s\n",Daten[b].Name);
		printf("Tag: %d\n",Daten[b].Tag);
		printf("Monat: %d\n",Daten[b].Monat);
		printf("Jahr: %d\n",Daten[b].Jahr);
		printf("PLZ: %d\n",Daten[b].PLZ);
		printf("Ort: %s\n",Daten[b].Ort);
		getch();
		fflush(stdin);
		system("cls");
	}
	free(Daten);
}
 
So funktionierts!
Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE 1

void main()
{
	int a=0, c=0;
	int abbruch=FALSE;

	typedef struct
	{
		char Name[31];
		int Tag;
		int Monat;
		int Jahr;
		int PLZ;

		char Ort[31];
	}Person;

	Person *Daten=NULL;
		
		
	FILE *datei;

	if((datei=fopen("datei.dat","r"))==NULL)
	{
		datei=fopen("datei.dat","w");
		fclose(datei);
	}

	datei=fopen("datei.dat","w");

	a=0;

	do
	{
		/*array auf länge a+1 erweitern/anlegen*/
		Daten=(Person*)realloc(Daten,sizeof(Person)*(a+1));

		
		printf("Name: ");

		scanf("%s",Daten[a].Name);

		if(Daten[a].Name[0]=='!')/*abbrechen bei eingabe des Ausrufe-Zeichens*/
		{
			abbruch=TRUE;
		}
		else
		{
			printf("Tag: ");
			scanf("%d",&Daten[a].Tag);
			fflush(stdin);


			printf("Monat: ");
			scanf("%d",&Daten[a].Monat);
			fflush(stdin);

			printf("Jahr: ");
			scanf("%d",&Daten[a].Jahr);
			fflush(stdin);

			printf("PLZ: ");
			scanf("%d",&Daten[a].PLZ);
			fflush(stdin);

			printf("Ort: ");
			scanf("%s",Daten[a].Ort);
			fflush(stdin);

			++a;/*index erhöhen*/
		}
	}
	while(abbruch!=TRUE);

	fwrite(Daten,sizeof(Daten),1,datei);

	fclose(datei);

	printf("Gespeichert");
	getch();
	fflush(stdin);
	system("cls");

	printf("Geöffnet");
	getch();
	fflush(stdin);
	system("cls");

	datei=fopen("datei.dat","r");
	fread(Daten,sizeof(Daten),1,datei);

	for(int b=0;b<a;b++)
	{
		printf("Name: %s\n",Daten[b].Name);
		printf("Tag: %d\n",Daten[b].Tag);
		printf("Monat: %d\n",Daten[b].Monat);
		printf("Jahr: %d\n",Daten[b].Jahr);
		printf("PLZ: %d\n",Daten[b].PLZ);
		printf("Ort: %s\n",Daten[b].Ort);
		getch();
		fflush(stdin);
		system("cls");
	}
	free(Daten);
}

Kommst Du damit klar?

PS: Das ist aber kein C++ , dass du da programmierst
 
Zuletzt bearbeitet:
Zurück