[C++] String einem nummerisches Array zuweisen

crazy_root

Mitglied
HaLo!

Google und Such-Funktionen sagen, dass das Thema schon 1000 mal durchgekaut worden is. Nur leider blick ich noch immer nicht ganz durch, wie ich das bewerkstelligen soll :confused:
Pointer, etc. viel zu kompliziert zu verstehen :D

In PHP würd das in etwas so aussehen....

PHP:
<?php
$array = array();
//...
while ($file = readdir($handle)) {
    $array[] = $file;
}
//...
?>

Logisch wäre dann natürlich in C++

Code:
char** name;    // keine Ahnung was das ** bewirkt, aber soll angeblich dann ein Array sein
int i = 0, j = 0;
//...
while (datei = readdir(verzeichnis)) {
    name[i++] = datei->d_name;
}                
//...
for (j = 0; j < i; j++) {
    cout<<name[j]<<endl;    // Dieser Teil funktioniert eben nicht
}
//...

Wenn ich jedoch den String manuell zuweise und ausgebe funktionierst...


Ich hab schon zig Vorschläge im Netz gelesen und jeder macht es anders.... Da soll man sich auskennen?
"So einfach als nötig" heißt es doch...

http://www.tutorials.de/forum/c-c/287863-cstring-array-deklarieren.html
So wie "Winner" es im 2 Beitrag schildert bräuchte ichs auch.
Nur halt dynamisch zuweisen, sprich ich kenn [x][y] nicht..

Ich blick halt einfach nicht durch...

Danke für euer Hilfe!
 
Zuletzt bearbeitet:
Hallo,

wenn du keine Ahnung hast, was ** bewirkt, dann solltest du dir wirklich erst mal die Grundlagen von C aneignen. An Zeigern wirst du so und so nicht vorbeikommen.

Du machst hier gleich mehrere Sachen falsch. Erstens dereferenzierst du einen Zeiger, ohne ihn zuvor initialisiert zu haben (name). Dass das Programm überhaupt läuft, ist also mehr Zufall als alles andere. Zweitens speicherst du mit der Zuweisung name[i++] = datei->d_name einen Zeiger auf einen Speicherbereich, von dem du nicht weißt, ob er nach dem nächsten Aufruf von readdir überhaupt noch gültig ist. Und nicht zuletzt mischst du C- (char *) und C++-Stil (cout).

Also am besten arbeitest du dich erst mal in die Speicherverwaltung mit C/C++ ein, denn die Fehler die du gemacht hast sind ziemlich grundlegender Natur.

Grüße,
Matthias
 
Der grundlegende Unterschied ist, dass es in C/C++ keinen vordefinierten Wert für undefinierte Variablen gibt (oder so ähnlich).
Zu deutsch, definierst du ein array, ist dessen Grösse erstmal NULL.
Da rein speichern kannst du gar nichts, solange du den dafür nötigen Speicher nicht reserviert hast.
Ich stehe mit alloc und malloc auch auf Kriegsfuss, aber es gibt da std::string und std::vector, damit kommt man zumindest halbwegs an das ran, was man aus PHP gewohnt ist.

Code:
#include <string>
#include <vector>

//array definieren
std::vector<std::string>MyArray;

//Eintrag einfügen
MyArray.push_back("irgendwas");

//Anzahl Einträge
int Anzahl = MyArray.size();

//Einzelner Eintrag
std::string EintragNrEins = MyArray[0];

//loop durchs Array
for(UINT i = 0; i < MyArray.size(); i++)
{
// mach irgendwas
}

Aber Vorsicht, auch wenn push_back() automatisch den nötigen Speicher bereit stellt, du hast nach wie vor nur genau so viel Platz im Array wie reserviert ist, und alles was nicht definiert ist, gibt es nicht.
Hat das Array nur 3 Einträge und man versucht irgendwas mit MyArray[4] stürzt die Anwendung gnadenlos ab und man kann auch nicht MyArray[5] definieren, solange MyArray[4] nicht existiert.
 
@ thomasio:
wobei es sich hier streng genommen nicht um ein array handelt sondern um eine container klasse die den [] operator überschreibt
 
Zurück