char array in string umformen ?



  • Nein erst die eine dann die andere Möglichkeit ! muss ich std: irgendwie deklarieren am anfang ?



  • FedoX schrieb:

    Nein erst die eine dann die andere Möglichkeit ! muss ich std: irgendwie deklarieren am anfang ?

    #include <string>
    
    int main()
    {
        char test[10] = "Test";
        std::string test1(test);
        std::string test2 = test;
    }
    


  • @ asc:
    Das sollte er eigentlich so gemacht haben...

    @ FedoX:
    Schick bitte deinen gesamten Code inklusive Fehlermeldung und Zeile nochmals. Achte beim Code darauf, dass du [cpp]-Tags verwendest.



  • Oh Gott bin ich ein depp ! Habe meinen Fehler jetzt rausgefunden : Ich hatte am anfang std: deklariert ! Läuft jetzt alles rund ! Vielen Dank an Alle die mir geholfen haben !!!

    PS : Wird nicht meine lezte Frage hier gewesen sein 😉



  • Mist ! Dadurch konnte mein Problem doch nicht gelöst werden ! Ich poste am besten mal den quellcode :

    #include <iostream>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <string>
    using namespace std;
    
    int main()
    {
    
        string user_name_string;
        char user_name[255];
        char computer_name[255];
        DWORD nSize;
    
       //Computer Name herrausbekommen
       nSize = sizeof( computer_name );
       GetComputerName( computer_name, &nSize );
       cout << "Computername:         " << computer_name << endl;
    
       //User Name herrausbekommen
       nSize = sizeof( user_name );
       GetUserName( user_name, &nSize );
    
       cout << endl;
       getchar();
    
    user_name_string = user_name;
    
    CopyFile("C:\\Dokumente und Einstellungen\\" + user_name_string + "\\Eigene Dateien\\Eigene Bilder\\Beispielbilder\\Blaue Berge.jpg", "C:\\BILD.jpg" , false);
    }
    

    So wenn ich mein proggi ausführe sagt Code:Blocks : C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\test\main.cpp|35|error: cannot convert `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to `const CHAR*' for argument `1' to `BOOL CopyFileA(const CHAR*, const CHAR*, BOOL)'|

    ...



  • Das ist auch nicht wirklich Standard-C++, was du da machst.

    Was erwartet denn CopyFile() für Argumente? Der Fehlermeldung nach sollte das erste vom Typ const char* sein. Du kannst zuerst einen std::string deklarieren und dann über c_str() den Zeiger auf const char erhalten:

    std::string MyString = "....";
    CopyFile(MyString.c_str(), ...);
    

    Vielleicht kannst du auch std::string::append() benutzen, um Strings zusammenzuketten. Oder du rufst den Konstruktor mit std::string("Text") explizit auf.


  • Administrator

    Wenn ich mal ein wenig rumpfuschen darf ...

    #include <iostream>
    #include <windows.h>
    // #include <stdio.h> Kein Standard C++ Header, richtig wäre <cstdio>
    // #include <stdlib.h> Kein Standard C++ Header, richtig wäre <cstdlib>
    // #include <sys/types.h> Wofür?
    // #include <sys/stat.h> Wofür? Die letzten 4 Header werden nicht benötigt, raus damit!
    #include <string>
    
    // using namespace std;
    // Auf using namespace sollte man, wenn möglich, verzichten.
    
    int main()
    {
      // char user_name[255]; 
      // char computer_name[255];
      // Bitte keine rohen Arrays in C++
      std::vector<char> user_name(UNLEN + 1); // Richige Grösse verwenden -> siehe MSDN
      std::vector<char> computer_name(MAX_COMPUTERNAME_LENGTH + 1); // Richtige Grösse verwenden -> siehe MSDN
    
      // DWORD nSize; Bitte keine ungarische Notation! Ist aber Geschmacksache ...
      DWORD size = computer_name.size();
    
      // nSize = sizeof( computer_name ); überflüssig jetzt.
    
      GetComputerName(&computer_name[0], &size);
      std::cout << "Computername:         " << &computer_name[0] << std::endl;
    
      //User Name herrausbekommen
      // nSize = sizeof( user_name ); überflüssig jetzt.
      size = user_name.size();
    
      GetUserName(&user_name[0], &size);
    
      std::cout << std::endl;
    
      // getchar(); Das ist C, hat in C++ nichts zu suchen!
      std::cin.get(); // <- macht das gleiche.
    
      // Als nächstes, für Pfadangaben, kann man unter Windows auch den Slash '/' nehmen.
      // Das macht es einfacher zu schreiben.
      std::string user_name_string = "C:/Dokumente und Einstellungen/";
      user_name_string.append(&user_name[0], user_name.size() - 1);
                                                             // ^ ohne das \0 Zeichen.
    
      user_name_string.append("/Eigene Dateien/Eigene Bilder/Beispielbilder/Blaue Berge.jpg");
    
      CopyFile(user_name_string.c_str(), "C:/BILD.jpg", FALSE);
      // user_name_string.c_str() -> Hole einen null terminierten String
      // Zudem muss man oder sollte man TRUE/FALSE verwenden bei WinAPI Funktionen.
      // Weil die kennen bool eigentlich nicht.
    
      return 0;
    }
    

    Zudem bitte C/C++ Code Tags verwenden.
    C++ Referenz: http://www.cplusplus.com/reference/

    Und natürlich sollte man bei den WinAPI Funktionen noch überprüfen, ob sie erfolgreich waren oder nicht. Dazu war ich jetzt aber zu faul, es auch noch in den obigen Code reinzunehmen.

    Grüssli



  • soo da bin ich wieder ! hatte die letzte zeit leider nicht genügend zeit (xD) um hier nen blick reinzufwerfen ! Ich habe jetzt deinen Quellcode kopiert und versucht zu starten doch meine neue IDE (habe jezzt Visual Studio express edition) beklagt sich über 17 Fehler !!! hier die Liste :

    Fehler 1 error C2039: 'vector': Ist kein Element von 'std' c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 19
    Fehler 2 error C2065: 'vector': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 19
    Fehler 3 error C2062: 'char'-Typ unerwartet c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 19
    Fehler 4 error C2039: 'vector': Ist kein Element von 'std' c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
    Fehler 5 error C2065: 'vector': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
    Fehler 6 error C2062: 'char'-Typ unerwartet c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
    Fehler 7 error C2065: 'computer_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 23
    Fehler 8 error C2228: Links von ".size" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 23
    Fehler 9 error C2065: 'computer_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 27
    Fehler 10 error C2065: 'computer_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 28
    Fehler 11 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 32
    Fehler 12 error C2228: Links von ".size" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 32
    Fehler 13 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 34
    Fehler 14 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 45
    Fehler 15 error C2065: 'user_name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 45
    Fehler 16 error C2228: Links von ".size" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 45
    Fehler 17 error C2664: 'CopyFileW': Konvertierung des Parameters 1 von 'const char *' in 'LPCWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 50



  • Entweder du hast:
    a) #include <vector> vergessen
    b) using namespace std; vergessen
    oder
    c) vector<X> statt std::vector<X> (besser als b) ) geschrieben



  • Hey ! Danke hat geklappt lag am fahlenden vector ! jetzt sind es nur noch 4 Fehler :

    Fehler 1 error C2065: 'UNLEN': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 20
    Fehler 2 error C2664: 'GetComputerNameW': Konvertierung des Parameters 1 von 'char *' in 'LPWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 28
    Fehler 3 error C2664: 'GetUserNameW': Konvertierung des Parameters 1 von 'char *' in 'LPWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 35
    Fehler 4 error C2664: 'CopyFileW': Konvertierung des Parameters 1 von 'const char *' in 'LPCWSTR' nicht möglich c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\loader\loader\main.cpp 51



  • Entweder du benutzt Unicode (L"string" + std::wstring), oder su stellst dein Projekt mal auf Multibyte.
    (Konfigurationseigenschaften->Allgemein->Zeichensatz auf Multi-Byte stellen).



  • wie gesagt ich fange gerade erst an und weis nicht wie ich dieses unicode benutze !!! kannst du mir des anhand code zeigen ??



  • FedoX schrieb:

    wie gesagt ich fange gerade erst an und weis nicht wie ich dieses unicode benutze !!! kannst du mir des anhand code zeigen ??

    Machs dir einfach und stell vorerst einfach auf Multibyte. Sofern du nicht vorhast eine japanische Version deines Programmes zu liefern, sollte das reichen. 😉

    Ansonsten schau mal hier im FAQ, oder Magazin nach. Da hat es IIRC etwas über das Thema.



  • Mann ! Ih find das in den Optionen nicht !!! Weis jemand wo ich diese Einstellung vornehmen kann ?

    ^^japanische versionen wirds noch nciht geben ! Erstmal reicht mir Europa und Amerika xD



  • drakon schrieb:

    Entweder du benutzt Unicode (L"string" + std::wstring), oder su stellst dein Projekt mal auf Multibyte.
    (Projekt->[Projektname]-Eigenschaften->Konfigurationseigenschaften->Allgemein->Zeichensatz auf Multi-Byte stellen).

    So.. Das sollte reichen. 😉 (hab noch das fette hinzugefügt)



  • FUA ! Es klappt ! Nur noch 1 einger Fehler !!!

    Fehler 1 error C2065: 'UNLEN': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\simon\eigene dateien\visual studio 2008\projects\rg\rg\rg.cpp 20

    ich bin schon wieder überfordert !!! aber aus Fehlern lernt man(n) , nich ?



  • Na. Doppelklick mal auf die Meldung und lies sie genau. Du hast UNLEN nicht deklariert.



  • was ist UNLEN denn ? ich weis ja noch nicht einmal wofür die gebraucht wird !? Das mit dem vector is mir auhc neu!



  • FedoX schrieb:

    was ist UNLEN denn ? ich weis ja noch nicht einmal wofür die gebraucht wird !? Das mit dem vector is mir auhc neu!

    Mach Doppelklick auf die Fehlermeldung, dann kommst du zu der Zeile Code, wo das drin steht. Sag mal so das ist. (und/oder zeig die Stelle Code mal..)



  • [cpp]#include <iostream>
    #include <windows.h>
    // #include <stdio.h> Kein Standard C++ Header, richtig wäre <cstdio>
    // #include <stdlib.h> Kein Standard C++ Header, richtig wäre <cstdlib>
    // #include <sys/types.h> Wofür?
    // #include <sys/stat.h> Wofür? Die letzten 4 Header werden nicht benötigt, raus damit!
    #include <string>
    #include <vector>
    
    // using namespace std;
    // Auf using namespace sollte man, wenn möglich, verzichten.
    
    int main()
    {
      // char user_name[255];
      // char computer_name[255];
      // Bitte keine rohen Arrays in C++
    	[quote]std::vector<char> user_name(UNLEN + 1); // Richige Grösse verwenden -> siehe MSDN[/quote]
      std::vector<char> computer_name(MAX_COMPUTERNAME_LENGTH + 1); // Richtige Grösse verwenden -> siehe MSDN
    
      // DWORD nSize; Bitte keine ungarische Notation! Ist aber Geschmacksache ...
      DWORD size = computer_name.size();
    
      // nSize = sizeof( computer_name ); überflüssig jetzt.
    
      GetComputerName(&computer_name[0], &size);
      std::cout << "Computername:         " << &computer_name[0] << std::endl;
    
      //User Name herrausbekommen
      // nSize = sizeof( user_name ); überflüssig jetzt.
      size = user_name.size();
    
      GetUserName(&user_name[0], &size);
    
      std::cout << std::endl;
    
      // getchar(); Das ist C, hat in C++ nichts zu suchen!
      std::cin.get(); // <- macht das gleiche.
    
      // Als nächstes, für Pfadangaben, kann man unter Windows auch den Slash '/' nehmen.
      // Das macht es einfacher zu schreiben.
      std::string user_name_string = "C:/Dokumente und Einstellungen/";
      user_name_string.append(&user_name[0], user_name.size() - 1);
                                                             // ^ ohne das \0 Zeichen.
    
      user_name_string.append("/Eigene Dateien/Eigene Bilder/Beispielbilder/Blaue Berge.jpg");
    
      CopyFile(user_name_string.c_str(), "C:/BILD.jpg", FALSE);
      // user_name_string.c_str() -> Hole einen null terminierten String
      // Zudem muss man oder sollte man TRUE/FALSE verwenden bei WinAPI Funktionen.
      // Weil die kennen bool eigentlich nicht.
    
      return 0;
    } [/cpp]
    

Anmelden zum Antworten