variables Feld?

Denver1

Grünschnabel
Hi @all!

Ich als noop wollte wissen, ob man in C/C++ ein variables Feld anlegen kann?
Es sollte so sein, dass der Benutzer die Länge des Text- Feldes selber bestimmt, also die max. Anzahl von Zeichen.
Ich wäre über ein paar Tipps sehr froh.

mfg, Denver1
 
Wenn du es wirklich variabel und nur abhaengig vom verfuegbaren Speicher machen willst, hilft dir die Funktion malloc() aus der Standardbibliothek weiter. mallo() liefert einen NULL Zeiger, wenn kein Speicher mehr vorhanden ist, sonst liefert er die Adresse des freien Speicher. ZB koennte sowas in c so aussehen:
Code:
#include <stdlib.h>

char *strtomem (char *s) { /* kopiere string in den freien Speicher */
   char *p;

   p=(char *) malloc(strlen(s)+1); /* Strings unter c Enden mit \0, deswegen +1 */
   if (p != NULL)
          strcpy(p,s);
    return p;
}
Zur erklaerung:
Du gibts malloc die Groesse in byte an, die du speichern willst. Hier muesste dann zB deine user angabe ueber die Laenge des Strings plaziert werden. Ein char ist ein byte, also brauchst du nur die Laenge des Strings. Bei anderen Objekten, zB Strukturen kannst du auch die sizeof Funktion benutzen: foo=(struct bar *) malloc(sizeof(struct bar));
Der Rueckgabewert vo malloc ist ein void pointer, um die funktion Typenunabhaengig zu machen. Deswegen steht dann hier auch immer ein expliziter cast auf den gewuenschten Pointertyp, aslo cast auf char Pointer (char *) oder cast auf Structure pointer (struct bar*).
du musst den Speicher auch wieder freigeben, wenn du ihn nicht benoetigst, dass machst du mit free(p).

Du musst dir jetzt natuerlich noch ueberlegen, wie du den String einliest und in den Speicher packst, denn der einzulesende string ist immer noch begrenzt und du musst ihn eventuell gesplittet einlesen, oder ob du gleich nur einzelne chars in den Speicher kopierst.
 
Du kannst auch vector benutzen.
Die erledigt die Allokierung für dich und du brauchst dich nicht um den ganzen Kleinkrust zu kümmern.
 
In C++ hast du soetwas eigentlich schon fertig drinnen: die Klasse std::string.

Hier musst du dich nicht drum kuemmern, ob jetzt genuegend Speicherplatz frei ist, sondern kannst der Instanz einfach beliebig lange Zeichenketten zuweisen:
Code:
std::string inp;

cin >> inp;

In C kannst du die Funktionen malloc und free benutzen, um dynamisch speicher zu allokieren:
Code:
char *inp;
int len;

printf("Maximale Laenge:");
scanf("%d", &len);
printf("\n");

inp = (char*)malloc(sizeof(char) * len);

/* inp darf jetzt `len' Bytes speicher belegen */

free(inp);  /* free am Ende nicht vergessen! */
10 Minuten zu spaet...
 
Hm, also so richtig funktioniert das immer noch nicht. Weil so etwas nicht geht:
char
cText[len];
und dann halt mit scanf len einlesen.

Oder ich bin nur zu doof.
 
Denver1 hat gesagt.:
Hm, also so richtig funktioniert das immer noch nicht. Weil so etwas nicht geht:
char
cText[len];
und dann halt mit scanf len einlesen.

Oder ich bin nur zu doof.
klar dass das nicht geht...
erzeug doch einfach ein dynamisches feld:
char feld[] = {0}; // ODER
char* feld = new char[len];
Dass kannst du dann beliebig vergrössern
 
Das mit dem

char cFeld = {0};

funktioniert leider nicht, da kommt ne Fehlermeldung.

Und mit vector seh ich nicht durch, da muß man doch auch ne Anzahl angeben.
 
Zurück