kleine Frage/Verwirrung zur Verwendung von Pointern zum Umgang mit Strings...



  • pointer können ja verwendet werden, um strings zu speichern und können dann auch verwendet werden, um den abgespeicherten string per cout auszugeben...

    folgender code funktioniert bei mir:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    char *ptr;
    ptr="hallo";
    cout << ptr << endl;
    
    system("PAUSE");
    return 0;
    }
    

    weshalb ist es aber nicht möglich, per cin dem pointer einen string zuzuweisen? folgendes funktioniert nämlich nicht:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    char *ptr;
    cin >> ptr;
    cout << ptr << endl;
    
    system("PAUSE");
    return 0;
    }
    

    das programm hängt sich dabei immer mit einem "windows-fehlerbericht-senden" fehlerfenster auf...



  • Hi,

    mach's richtig:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    string str;
    cin >> str;
    cout << str << endl;
    
    system("PAUSE");
    return 0;
    }
    

    Dann funktioniert's auch mit dem Einlesen. 😃
    Was Dir bei Deinem Beispiel fehlt (und was Du für das Handling von Zeichenketten auch gar nicht brauchst), ist das Speichermanagement.

    Gruß,

    Simon2.

    P.S.: Zum Verständnis: "Hallo" lässt dem Compiler "readonly-Speicher" anlegen und ptr zeigt darauf. "cin >> ptr" wird nun versuchen, dahin zu schreiben, wohin ptr zeigt ... und da das verboten ist, gibt's "undefiniertes Verhalten" (was alles bedeuten kann von "Tut's trotzdem irgendwie manchmal" bis hin zu "Rechnerplatine schmort durch").



  • MrWulf schrieb:

    pointer können ja verwendet werden, um strings zu speichern und können dann auch verwendet werden, um den abgespeicherten string per cout auszugeben...

    Aber nur wenn du Speicher allozierst.

    Besser: std::string

    MrWulf schrieb:

    folgender code funktioniert bei mir:

    Leider... Du weist dem Zeiger ein temporären Wert zu. Es könnte dir genausogut um die Ohren fliegen

    MrWulf schrieb:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    char *ptr;
    ptr="hallo";
    cout << ptr << endl;
        
    system("PAUSE");
    return 0;
    }
    

    NIEMALS: Zeiger auf nicht allozierten Speicher verwenden
    MÖGLICHTS NIEMALS: system("PAUSE"), hier steht in der Konsolen-FAQ eine bessere (C++) und portablere Lösung.

    Die C++ Lösung: Verwende std::string
    Die restlichen Lösungen kannst du hier finden wenn du dir auch nur die ersten 20 Nachrichten durchsuchst... (Thema char[], new/delete, strcpy...).

    Der Rest ergibt sich daraus.

    cu André



  • Hinweis schrieb:

    ... Du weist dem Zeiger ein temporären Wert zu....

    Hmmmmm, ich denke, dass das nicht stimmt. "Hinweis" ist ein Stringliteral, das schon im Speicher liegt (und damit "alloziert" ist) ... aber eben in Speicher, der nicht beschreibbar ist.
    Ich würde sogar sagen, dass dieser Speicherbereich weniger "temporär" ist als alles Andere, was alloziert ist (wird oftmals schon mit dem Programmcode in den Speicher geladen) 😉

    Gruß,

    Simon2.



  • ok, danke für die schnellen antworten, dass ich das mit dem string-objekt lösen kann weiss ich, ich wollte einfach mal wissen, wieso es nicht auch mit pointern klappt 🙂

    nun zu meinem eigentlichen problem:

    #include <iostream>
    #include <string>
    using namespace std;
    
        struct candybar{
               string bezeichnung;
               double weight;
               int calories;
        }object1;
    
    void function(candybar a, string name="Millenium Munch", double gewicht=2.85, int kalorien=350);
    void function2(candybar b);
    
    int main()
    {
    candybar & j=object1;
    function(j);
    
    candybar & i=object1;
    function2(i);
    
    system("PAUSE");
     return 0;   
    }
    
    void function(candybar a, string name, double gewicht, int kalorien){
         cout << "namen der süssigkeit eingeben: " << endl;
         cin >> name;
         a.bezeichnung=name;
         cout << "gewicht eingeben: " << endl;
         cin >> gewicht;
         a.weight=gewicht;
         cout << "kalorien eingeben: " << endl;
         cin >> kalorien;
         a.calories=kalorien;
         }
    void function2(candybar a){
         cout << a.bezeichnung << endl << a.weight << endl << a.calories << endl;
         }
    

    das programm schafft es leider nicht, dem string "bezeichnung" über die referenz den eingegebenen string zuzuweisen, mir leuchtet jedoch nicht ein warum nicht?



  • Musst "candybar" auch als Referenz übergeben.

    void function(candybar &a){
         cout << "namen der süssigkeit eingeben: " << endl;
         cin >> a.bezeichnung;
         cout << "gewicht eingeben: " << endl;
         cin >> a.weight;
         cout << "kalorien eingeben: " << endl;
         cin >> a.calories;
    }
    


  • Hi,

    nicht der Aufrufer entscheidet, ob in seinen Parameter etwas geschrieben wird, sondern die Funktion.

    MrWulf schrieb:

    ...

    ...
    void function(candybar a, string name="Millenium Munch", double gewicht=2.85, int kalorien=350);
    void function2(candybar b);
    ...
    

    ...

    Deine Funktionen nehmen jeweils Kopien von Objekten entgegen. HIER sollten Referenzen stehen : function(candybar& a, string& name... ) - jedenfalls für die Parameter, die Du in der Funktion ändern willst.

    Gruß,

    Simon2.



  • ok, funzt jetzt, danke!


Anmelden zum Antworten