Char in String



  • ich muss einen Char machen wegen dieser Funktion hier:
    GetUserName( user_name, &nSize );

    und user_name muss ein Char sein .



  • Dann rufe die Funktion mit string::c_str() auf.



  • Wie solle ich das genau machen?
    Ein Beispiel wäre gut 🙂

    Danke



  • string nachname = "Müller";
    string name = "Herbert " + nachname + ", hallo!";
    ...
    GetUserName( name.c_str(), &nSize );
    


  • danke schonmal 🙂
    was ist hier falsch?

    DWORD nSize;
    string usernamee;
    nSize = sizeof( usernamee.c_str() );

    GetUserName( usernamee.c_str(), &nSize );

    Der Compiler spuckt hier Fehlermeldungen aus.
    Bitte um hilfe!
    Sorry in diesen Gebiet bin ein nonob 😃



  • Happysheep schrieb:

    was ist hier falsch?

    DWORD nSize;  
      string usernamee;  
      nSize = sizeof( usernamee.c_str() ); 
      
      GetUserName( usernamee.c_str(), &nSize );
    

    Der Compiler spuckt hier Fehlermeldungen aus.

    Welche denn?

    Nicht, dass ich das nicht schon erahnen könnte, was hier schief läuft. Aber Du könntest mal versuchen selbst drauf zu kommen.

    Außerdem ist die Hilfe, die Du bekommst, auch immer nur höchstens so gut, wie die Information, die Du über das Problem gibst. Ich kann zumindest nicht Gedanken lesen. Raten kann ich aber: Ich rate mal, dass GetUserName in etwa so deklariert wurde

    void GetUserName(char* pName, DWORD* nSize);
    

    und dass die Funktion auch einen Namen zurückgeben soll. Das mag Dir klar sein, wurde aber nirgends erwähnt...

    Hausaufgaben:
    - Was gibt std::string::c_str() eigentlich genau zurück?
    - Was bekomme ich, wenn ich sizeof auf das Ergebnis loslasse?
    - Warum frisst der Compiler den Code nicht?

    Du willst doch auch was lernen, oder? :p

    Gruß,
    SP



  • Hausaufgaben:
    - Was gibt std::string::c_str() eigentlich genau zurück?
    - Was bekomme ich, wenn ich sizeof auf das Ergebnis loslasse?
    - Warum frisst der Compiler den Code nicht?

    Du willst doch auch was lernen, oder? :p

    Gruß,
    SP

    1. Ähm irgendwie nen Const char weis zwar nicht was das ist aber steht unten bei den Compiler fehlern.

    2. Ja das &nSize dann nicht definiert wurde?

    3. Ich glaube weil der Compiler den const char nicht in einen *CHAR umwandeln kann.

    Weil mit Chars funktionierts auch :

    char user_name[255];
    nSize = sizeof( user_name );
    GetUserName( user_name, &nSize );

    Danke für die Antwort, ich bin zwar ein bisschen schlauer geworden aber das Problem hab ich immer noch nicht gelöst 😕



  • Happysheep schrieb:

    SP schrieb:

    - Was gibt std::string::c_str() eigentlich genau zurück?
    - Was bekomme ich, wenn ich sizeof auf das Ergebnis loslasse?
    - Warum frisst der Compiler den Code nicht?

    Ähm irgendwie nen Const char weis zwar nicht was das ist aber steht unten bei den Compiler fehlern.

    Ja. c_str() ist nur für den lesenden Zugriff gedacht. Mit c_str() kannst Du einer Funktion immerhin noch einen Zeiger auf eine (über diesen Zeiger zumindest) unveränderliche Zeichenkette übergeben. Das ist dann sinnvoll, wenn man einer C-Funktion, die einen const char* -Parameter erwartet, eine "Zeichenkette" übergeben will.

    Die GetUserName Funktion sieht aber eher so aus (Deklaration+Name), als ob die dazu da wäre, eine "Zeichenkette" zurückzugeben. Das funktioniert nicht direkt mit einem std::string -Objekt -- zumindest nicht portabel.

    Happysheep schrieb:

    SP schrieb:

    Was bekomme ich, wenn ich sizeof auf das Ergebnis loslasse?

    Ja das &nSize dann nicht definiert wurde?

    Diesen "Satz" verstehe ich nicht. Die Antwort wäre gewesen: c_str() gibt einen Zeiger zurück und die Größe eines Zeigers hat weder etwas mit der Länge der durch den Zeiger referenzierten Zeichenkette, noch mit der Größe des durch den Zeiger referenzierten Speicherblocks zu tun. Die Größe eines solchen Zeigers ist systemspezifisch aber konstant -- meistens 4 oder 8, aber verlass Dich nicht darauf.

    Happysheep schrieb:

    SP schrieb:

    Warum frisst der Compiler den Code nicht?

    Ich glaube weil der Compiler den const char nicht in einen *CHAR umwandeln kann.

    Eine implizite Umwandlung von const char* zu char* gibt es nicht. Das ist auch gut so. In diesem Fall doppelt gut; denn es hätte eh nicht funktioniert.

    Happysheep schrieb:

    Weil mit Chars funktionierts auch:

    char user_name[255];  
      nSize = sizeof( user_name ); 
      GetUserName( user_name, &nSize );
    

    In diesem Fall ist name kein Zeiger sondern ein Array. Und der sizeof-Operator liefert Dir die Anzahl der Bytes, die dieses Array im Speicher belegt -- also sizeof(char)*255.

    Du darfst Arrays und Zeiger nicht verwechseln. Das sind schon zwei grundlegend verschiedene Dinge.

    Happysheep schrieb:

    Danke für die Antwort, ich bin zwar ein bisschen schlauer geworden aber das Problem hab ich immer noch nicht gelöst 😕

    Du musst da wohl bei dem char -Array bleiben. Was macht denn nun diese GetUserName -Funktion genau? Stammt die von Dir? Gibt eine Beschreibung? Wenn ich wieder raten soll: Sie schreibt einen Namen in das Array, welches der Aufrufer per Zeiger übergibt. Die Größe des Puffers wird mitübergeben, damit die Funktion nicht über das Ende hinaus schreibt. Weil die Größe als Zeiger auf eine DWORD-Variable übergeben wird, gehe ich davon aus, dass die Funktion diese Variable ändert -- womöglich wird sie auf die Länge des Namens gesetzt. Das sind jetzt alles Dinge, die zu einer Beschreibung für eine solche Funktion gehören.

    Gruß,
    SP



  • Vielen Dank für die Antwort.
    Die Funktion habe ich nicht selbst geschrieben sondern die gibt es schon fürs Rausfinden vom Benutzername des Computers.
    Dafür war es eigentlich auch gedacht.
    Ich wollte dass ich den zurückgegeben char in einen String packen kann.
    Dieser String sollte eigentlich den Dateipfad angeben.
    Also das das Programm weis wie der Benutzername auf den Computer heist und dann auch etwas speichern kann.

    Ich glaub dazu gibts auch noch eine andere Funktion`?

    MfG Happysheep



  • Die Funktion habe ich nicht selbst geschrieben sondern die gibt es schon fürs Rausfinden vom Benutzername des Computers.

    Dann würde ich sie so nutzen:

    #include <cstdlib>
    #include <string>
    #include <vector>
    const std::size_t LENGTH_PER_LOOP = 20;
    
    std::vector<char> mystring;
    
    int laenge;
    for(int i(1); ; ++i)
    {
      const std::size_t act_length = LENGTH_PER_LOOP * i;
      mystring.resize(act_length);
      laenge = act_length;
      GetUserName(&mystring[0], &laenge);
      if(laenge < act_length)
        break;
    }
    
    std::string username(&mystring[0], &mystring[laenge-1]);
    

    oder

    #include <cstdlib>
    #include <string>
    const std::size_t MAX_LENGTH = 500;
    
    char mystring[MAX_LENGTH];
    int laenge(MAX_LENGTH);
    GetUserName(&mystring[0], &laenge);
    
    if(laenge == MAX_LENGTH)
      //fehlerbehandlung
    
    std::string username(&mystring[0], &mystring[laenge-1]);
    

    Wenn man das schön in ne Funktion verpackt, sieht man auch nicht mehr, wie hässlich das umgesetzt ist ^^
    dann bräuchtest du die globale variable (so wie sie jz ist) auch nicht - sondern nimmst halt ne static variable...

    ob es da noch ne andere fkt gibt, weiß ich nicht - klingt wie winapi - also mal in der msdn gucken oder im winapi forum fragen, wenn du nix findest - allerdings glaube ich nicht, dass es die funktionalität dort nochmal zu finden ist.

    bb

    edit: vergessen, laenge zu initialisieren ^^

    edit nr. 2:

    http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx schrieb:

    A buffer size of (UNLEN + 1) characters will hold the maximum length user name including the terminating null character. UNLEN is defined in Lmcons.h.

    brauchst das also gar nich so sehr kompliziert machen:

    #include <Lmcons.h>
    #include <string>
    #include <vector>
    
    std::basic_string<TCHAR> GetUserName_TheCppWay()
    {
      std::vector<TCHAR> mystring(UNLEN+1);
      DWORD size(UNLEN+1);
      GetUserName(&mystring[0], &size);
      return basic_string<TCHAR>(&mystring[0], &mystring[size-1]);
    }
    

    das ganze kann man dann natürlich auch noch mit dem char[] weg machen - allerdings kann man damit und nem großen UNLEN auch ganz schnell den Stack sprengen ^^

    bb


Anmelden zum Antworten