LPCSTR mit cin eingeben?!



  • Es ist kein ungültiges C++... der Zeiger ist einfach wieder ungültig...



  • Jochen Kalmbach schrieb:

    Beachte dass ein ".c_str)" in der nächsten Zeile schon wieder üngültig ist!!!

    Also korrekt wäre:

    std::string str("test");
    printf("%s", str.c_str());
    

    Falsch wäre:

    std::string str("test");
    LPCTSTR szStr = str.c_str();
    printf("%s", szStr);
    

    Warum ist dies so?


  • Mod

    Weil es so im Standard steht...



  • öhm... also AFAIK ist das Ergebnis (zumindest C++11) von c_str() solange gültig wie das entsprechende std::string Objekt lebt bzw. der std::string Inhalt geändert wird...

    Es wird ja kein Temporary zurückgegeben...

    Edit:
    Auch in C++03 (21.3.6) ist es so...
    In C++11 ist die Stelle 21.4.7.1



  • Jo is eigentlich relativ klar:

    <a href= schrieb:

    http://www.cplusplus.com/reference/string/string/c_str/">A program shall not alter any of the characters in this sequence.
    ...
    The pointer returned may be invalidated by further calls to other member functions that modify the object.



  • In diesem speziellen Fall ist es noch gültig... vielleicht wird das Objekt ja von einem anderen Thread geändert 😉 es war ja nur ein ganz einfaches Beispiel. was die 3000 Zeilen drum rum nicht gezeigt hat.

    Deshalb verwende ich sowas *nie*... bzw. nur als "temporary"...



  • Jochen Kalmbach schrieb:

    In diesem speziellen Fall ist es noch gültig... vielleicht wird das Objekt ja von einem anderen Thread geändert 😉 es war ja nur ein ganz einfaches Beispiel. was die 3000 Zeilen drum rum nicht gezeigt hat.

    Deshalb verwende ich sowas *nie*... bzw. nur als "temporary"...

    Naja, empfinde ich ein bisschen viel "Wind" um eine Selbverständlichkeit - es ist auch kein spezieller Fall. Und wenn der String von verschiedenen Threads verändert wird, ist nicht nur c_str() Problem.



  • Martin Richter schrieb:

    Weil es so im Standard steht...

    Kann ich nicht sehen.

    Solange du den String nicht mit etwaigen Methoden irgendwie beeinflusst, dann ändert sich da auch nichts. Somit sind deine beiden Beispiele gültig.

    The pointer returned may be invalidated by further calls to other member functions that modify the object.

    Ist doch verständlich und logisch, somit sollte man so etwas einfach standardmäßig wissen.

    Und wenn man Threads verwendet, dann sollte man auch Threadsicher programmieren und nicht den String ohne entsprechende Verwaltung einfach "paralell" ändern bzw. lesend zugreifen und sich wundern, dass Kauderwelch herauskommt. :p
    Wenn man Multithreading programmiert, dann sollte man immer darauf achten, dass sich lese-schreibtechnisch nichts überschneidet. Das liegt dann aber im Ermessen des Programmierers und ist keine Ungültigkeit des C++ Strings.



  • Wie erklär ich es nur....... wenn man den Anfängen nicht wehrt, dann kommt sowas raus: http://www.c-plusplus.net/forum/p2299109#2299109

    Das kann doch ein "normaler" oder "anfänger" nie unterschiedenn wann er was machen darf... deswegen bleibe ich bei meiner Meinung, dass man sowas nur als "temporary" verwenden darf.
    Bei meinen Code-Reviews wird auch weiterhin so eine Stelle angemeckert...



  • Um mal wieder auf die eigentlich Frage zurückzukommen ...

    CraiZzy schrieb:

    Ich habe eine frage. Nämlich wie kann ich einen LPCSTR in einer console Application eingeben lassen.

    ...

    Wie kann ich das dann irgendwie eingeben lassen?

    Ws bedeutet irgendwie ?

    Man sollte sich möglichst für streams, klassen, C++ oder für C entscheiden.

    Da es sich vermutlich um einen Anfänger handelt hier eine billige Lösung.

    #define MAXSTRING 256
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    char buffer[MAXSTRING+1];
    
    fgets(buffer, MAXSTRING, stdin);
    
    LPCSTR bla = buffer;
    
    // . . .
    


  • Warum muss man überhaupt einen LPCSTR eingeben?
    Reicht kein std::string?


Anmelden zum Antworten