Einem char Arry ein String Array zuweisen



  • Moin!

    Bei dem unten aufgeführten Code soll der erste Inhalt des Array "folder_list" in das Array "path" kopiert werden.

    Aber mein Programm stürzt immer ab, wieso?

    string folder_list[1000];
    
    char path[] = "c:/";
    
    ...
    
    void func() {
    
    	int all = sizeof(path) + sizeof(folder_list[0]);
    
    	char* path = new char[all];  // array "path" wird vergrößert / größe wird bearbeitet [all]
    
    	path='\0';
    
    	for(int i; i<all;i++) {
    
    		path[i]=folder_list[0][i];
    
    	}
    
    }
    

    Grüße

    user_1992



  • user_1992 schrieb:

    // string folder_list[1000]; // Wir nehmen einen vector
    vector<string> folder_list(1000);
    
    // char path[] = "c:/"; // Wir nehmen einen string
    string path = "c:/";
    
    // BTW: Globale Variablen sind schlecht
    
    ...
    
    void func() {
    	
    	// int all = sizeof(path) + sizeof(folder_list[0]); // ? 4 + sizeof(string)? 
    	
    	// char* path = new char[all];  // array "path" wird vergrößert / größe wird bearbeitet [all] // Schwachsinn, du verdeckst globales path
    	
    	//path='\0'; // ?
    	
            for (int i = 0; i < folder_list.size(); ++i) // Oder mit Iteratoren
            {
                path += folder_list[i];
            }
    
    	// path erhält den String C:\ gefolgt vom Inhalt aus folder_list. Wars das, was du wolltest?
    }
    

    Grüße

    user_1992


  • Mod

    Da dran ist so ziemlich jede Zeile falsch. Und zwar nicht nur ein bisschen, sondern richtig, richtig falsch. Gute Büchertipps findest du in meiner Signatur.

    Du suchst wohl so etwas wie den directory_iterator, wenn du mit Verzeichnissen hantieren möchtest. Die Zeichenketten als Umweg sind unnötig. Wenn du mit Zeichenketten arbeitest, dann solltest du bei veränderlichen Zeichenketten immer mit std::string arbeiten. In C++ praktisch niemals new für Felder nutzen! Ebenso solltest du, wenn du mit Feldern unbekannter Größe hantierst, niemals einfach ein großes Feld nehmen, sondern vector, so wie es vorgesehen ist.

    Deinen Code kann man nicht wirklich korrigieren. Ich habe keine Ahnung, was der überhaupt letztendlich machen soll oder wo ich mit Korrekturen anfangen sollte.



  • Duc machst echt so ziemlich alles falsch.

    #include <string>
    #include <vector> // oder list oder deque
    std::vetor<std::string> folder_list;
    
    std::string func()
    {
        std::string path;
        if (!folder_list.empty())
            path = folder_list.front();
        else
            path = ""; // leerer string im Fehlerfall
        return path;
    }
    

    Idealerweise sparst du aber auch die globale Variable folder_list und übergibst sie stattdessen als Parameter.



  • Ich wollte den Code in den unten stehende Code einfügen.
    Der Code soll später Ordner für Ordner jeden Ordner / bzw jede Datei auflisten.

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <dirent.h>  // for folder list
    
    using namespace std;
    
    int folder_count = 0;
    string folder_list[1000];
    
    char path[] = "c:/";
    
    void func_folder_list() {
    
        DIR *dir;
        struct dirent *entry;  
    
        dir = opendir(path);
        if(!dir) return;
    
        while(entry = readdir(dir))
        {
    
            folder_list[folder_count] = entry->d_name;
    
            cout << folder_list[folder_count] << endl;
    
            ++folder_count;
    
        }
    
        closedir(dir);
    
    }
    
    void func_write_folder_contents() {
    
        string fileName = "file.txt";
        ofstream write_file;
    
        write_file.open(fileName.c_str(), ios_base::out);
    
        if(!write_file)
        {
    
            cout << "can not open file" << endl;
    
            return;
    
        }
    
        for(int i = 0; i < folder_count; ++i)
        {
    
        	write_file << path;
    
            write_file << folder_list[i] << endl;
    
            // cout << i << " " << folder_list[i] << endl;
    
        }
    
    }
    
    void func() {
    
    	int all = sizeof(path) + sizeof(folder_list[0]);
    
    	char* path = new char[all];  // array "path" wird vergrößert / größe wird bearbeitet [all]
    
    	path='\0';
    
    	for(int i; i<all;i++) {
    
    		path[i]=folder_list[0][i];
    
    	}
    
    }
    
    int main()
    {
    
        func_folder_list();
    
        func_write_folder_contents();
    
        func();
    
        getchar();
    
        return 0;
    
    }
    

  • Mod

    Mal wirklich, willst du nicht erst einmal vernünftig C++ lernen? Da sind immer noch die gleichen Fehler drin wie in deinen anderen Threads. Der Code ist bloß eine minimal angepasste Version des Codes, den dir phanzy gegeben hat und der war schon nur ein absoluter Notnagel, um deinen Ursprungscode überhaupt irgendwie ausführbar zu machen.
    Programmieren ist nicht Copy&Paste! Auch nicht Anpassen von Codefetzen. Auch nicht Zusammenkopieren und Anpassen von Codefetzen. Erst recht nicht, in verschiedenen Foren so lange um Beispiele und Korrekturen zu betteln, bis es läuft!

    Wenn du programmierst, dann musst du von jeder Zeile und jedem einzelnen Zeichen genau wissen, wieso du es setzt.

    Ich habe hingegen den Eindruck, dass unsere Ratschläge auf taube Ohren stoßen. Vermutlich nicht einmal aus Absicht, sondern weil dir das Grundwissen fehlt, die Ratschläge zu verstehen. Die Lehrbücher würden dies ändern.


Anmelden zum Antworten