Strings in Array



  • Hallo.
    Bin noch ziemlicher Anfänger in der C++ Programmierung.
    Wollte mir gerade mal aus Spaß ein Tic Tac Toe Spiel als Konsolenanwendung schreiben.
    Dort soll in einem Array die Namen der Spieler eingetragen werden.
    Im ersten Eintrag also der Name von Spieler1 und im zweiten Eintrag der Name von Spieler2.

    Das erste Problem ist das es ja den Typ string in C++ gar nicht gibt, sondern strings sind ja Arrays aus Zeichen.

    Das hier ist der Code, mit dem ich es versucht habe:

    char username[2][255];
    sprintf(username[0], "Jan");
    

    Als Fehlermeldung bekomme ich das hier:

    1>------ Erstellen gestartet: Projekt: tictactoe, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>tictactoe.cpp
    1>tictactoe.cpp(16) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>tictactoe.cpp(16) : error C2365: "sprintf": Erneute Definition; vorherige Definition war "Funktion".
    1> ...\microsoft visual studio 9.0\vc\include\stdio.h(366): Siehe Deklaration von 'sprintf'
    1>tictactoe.cpp(16) : error C2078: Zu viele Initialisierungen
    1>tictactoe.cpp(16) : error C2440: 'Initialisierung': 'const char [6]' kann nicht in 'int' konvertiert werden
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    1>Das Buildprotokoll wurde unter "file://...\tictactoe\Debug\BuildLog.htm" gespeichert.
    1>tictactoe - 4 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Bei einem Freund funktioniert das scheinbar, ich habe es auch mit strcpy() versucht. Wo könnte dort der Fehler liegen? Ich will jetzt auch nicht auf irgendwelche anderen Lösungen zurückgreifen, also keine weiteren Header inkludieren oder so. Momentan habe ich "iostream" und "stdio.h" ( für sprintf ) inkludiert.

    Danke im Voraus

    Jan



  • teremy schrieb:

    Das erste Problem ist das es ja den Typ string in C++ gar nicht gibt, sondern strings sind ja Arrays aus Zeichen.

    Wie kommst du darauf? Natürlich gibt es den.
    Richtig würde dein Beispiel so lauten:

    std::string username[2];
    username[0]="Jan";
    

    std:: darfst du auch weglassen wenn du irgendwo am Anfang der Übersetzungseinheit using std::string oder auch using namespace std; schreibst.



  • Benutze std::string .

    #include <vector>
    #include <string>
    #include <iostream>
    
    int main ()
    {
     std::vector<std::string> names;
    
     names.push_back ( "jan" );
    }
    

    Dazu kannst du std::vector benutzen, anstatt ein Array.

    Näheres dafüber erfährst du hier:
    http://www.cplusplus.com/reference/stl/



  • Und deswegen schrieb ich ja extra, dass ich nichts weiteres inkludieren will. Weil das mein Problem nicht löst, sondern ich dem Problem ja nur ausweiche damit. Ich will ja trotzdem wissen, weshalb es nicht funktioniert. Wie ich es dann letztendlich mache ist ja zweitrangig, von Interesse ist für mich aber, wieso es nicht klappt, was ist da also falsch an meinem Code bzw. wie müsste mein Code richtig lauten?



  • Dann musst du im richtigen Forum fragen (ANSI C).
    Dort wirst du eher Leute finden, die sich mit C-Funktionen auskennen.



  • Und wie sieht es mit strcpy() aus? Damit hat es bei mir ja auch nicht funktioniert.



  • teremy schrieb:

    Und wie sieht es mit strcpy() aus? Damit hat es bei mir ja auch nicht funktioniert.

    "es" = ?
    wenn du was falsch machst, können wir kaum erraten, was das ist, wenn du nicht zeigst, wie du das tust... ><



  • char name[3][6] = {0};
    
    strcpy(name[0], "paul");
    strcpy(name[1], "peter");
    strcpy(name[2], "klaus");
    

    Das ist mein Code und das hier ist die Fehlermeldung:

    1>------ Erstellen gestartet: Projekt: tictactoe, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>tictactoe.cpp
    1>...tictactoe\tictactoe\tictactoe.cpp(16) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>...tictactoe\tictactoe\tictactoe.cpp(16) : error C2365: "strcpy": Erneute Definition; vorherige Definition war "Funktion".
    1> ...\microsoft visual studio 9.0\vc\include\string.h(74): Siehe Deklaration von 'strcpy'
    1>...tictactoe\tictactoe\tictactoe.cpp(16) : error C2078: Zu viele Initialisierungen
    1>...tictactoe\tictactoe\tictactoe.cpp(16) : error C2440: 'Initialisierung': 'const char [5]' kann nicht in 'int' konvertiert werden
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    1>...tictactoe\tictactoe\tictactoe.cpp(17) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>...tictactoe\tictactoe\tictactoe.cpp(17) : error C2365: "strcpy": Erneute Definition; vorherige Definition war "Funktion".
    1> ...\microsoft visual studio 9.0\vc\include\string.h(74): Siehe Deklaration von 'strcpy'
    1>...tictactoe\tictactoe\tictactoe.cpp(17) : error C2078: Zu viele Initialisierungen
    1>...tictactoe\tictactoe\tictactoe.cpp(17) : error C2440: 'Initialisierung': 'const char [6]' kann nicht in 'int' konvertiert werden
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    1>...tictactoe\tictactoe\tictactoe.cpp(18) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>...tictactoe\tictactoe\tictactoe.cpp(18) : error C2365: "strcpy": Erneute Definition; vorherige Definition war "Funktion".
    1> ...\microsoft visual studio 9.0\vc\include\string.h(74): Siehe Deklaration von 'strcpy'
    1>...tictactoe\tictactoe\tictactoe.cpp(18) : error C2078: Zu viele Initialisierungen
    1>...tictactoe\tictactoe\tictactoe.cpp(18) : error C2440: 'Initialisierung': 'const char [6]' kann nicht in 'int' konvertiert werden
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    1>Das Buildprotokoll wurde unter "file://...tictactoe\tictactoe\Debug\BuildLog.htm" gespeichert.
    1>tictactoe - 12 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • Also

    #include <iostream> 
    
    int main() 
    { 
    	char name[3][6] = {0}; 
    
    	strcpy(name[0], "paul"); 
    	strcpy(name[1], "peter"); 
    	strcpy(name[2], "klaus");
    
    	return 0;
    }
    

    geht bei mir (:



  • teremy schrieb:

    ......
    Das erste Problem ist das es ja den Typ string in C++ gar nicht gibt, ...

    Das ist schonmal falsch - und auch schon der Anfang on Deinem Problem.

    Du brockst Dir selbst Probleme ein, indem Du statt des einfachen/richtigen Weges einen umständlichen wählst.

    Du willst mit strings arbeiten => arbeite mit string.
    Du willst mit character arrays arbeiten (warum auch immer) => arbeite mit character arrys.

    Zweiteres ist schwieriger und in viiiielen Fällen komplett unnötig und Du solltest nicht behaupten, es "ginge in C++ nicht anders" oder es "wäre geschummelt". Ist es auch "eine Umgehung des Problems" oder "geschummelt", wenn Du ohne Augenbinde programmierst? 😉

    Gruß,

    Simon2.

    P.S.: Wenn Du eine Funktion verwenden möchtest (wie z.B. printf()), dann solltest Du Dir mal ansehen, wie sie verwendet werden soll - am Besten bei der cppreference.com o.ä. ...

    P.P.S.: Du kannst auch mit arrays von strings arbeiten (also ohne vector) - dann inkludierst Du nicht mehr (sogar einen '.' und ein 'h' weniger) als mit der strcpy()-Version.



  • Ich meine ja, dass ich durchaus bereit bin mich eines besseren belehren zu lassen und ich werde dann in Zukunft wohl auch strings verwenden. Nichtsdestotrotz interessiert mich eben, wieso es so nicht funktioniert hat, wie ich es vorhatte.
    Natürlich kann das eine unbequeme, unnötige, bescheuerte Lösung von mir sein, aber funktionieren müsste sie ja trotzdem und das ist es eben was mich interessiert.
    Mal abgesehen davon arbeite ich ja mit einem Buch und wollte nicht mehr Funktionen nutzen, als ich kennengelernt habe. Natürlich wird man als fortgeschrittener Programmierer über meinen jetzigen Code lachen, das ist ja immer so.
    Es funktioniert jetzt mittlerweile übrigens. Der Code ging tatsächlich, das Problem lag darin, dass ich strcpy() und auch sprintf() etc. außerhalb von "int main(void){...}" geschrieben hatte. Also nach "using namespace std;" wo ich auch ein paar Variablen definiere, da habe ich gleich meinen Code geschrieben.
    Vielen Dank für eure Hilfe, ich werde mir auf jeden Fall auch mal die anderen Lösungen anschauen. Das ist schon wieder ein Minuspunkt für das Buch. Ich meine tatsächlich im Kopf zu haben, dass es behauptet, dass es keinen String-Typ in C++ gibt, sondern Strings schlichtweg Arrays aus Zeichen sind. Aber kann ja sein, dass das später nochmal auftaucht.



  • Ich meine tatsächlich im Kopf zu haben, dass es behauptet, dass es keinen String-Typ in C++ gibt, sondern Strings schlichtweg Arrays aus Zeichen sind.

    Das ist im Prinzip auch wahr, allerdings stellt die Standard-Bibliothek hierfür (und für viele andere Dinge) Klassen bereit, die diese Funktionen übernehmen. Intern arbeitet std::string auch mit char-Arrays, aber das ist ja nicht dein Problem.
    Wenn dein Buch gut ist, gibt es sicher irgendwo ein Kapitel "STL" oder ähnliches, das sich damit beschäftigt. Außerdem kannst du mal auf cplusplus.com schauen, da gibt es eine Referenz dazu: http://www.cplusplus.com/reference/string/string/



  • teremy schrieb:

    Ich meine tatsächlich im Kopf zu haben, dass es behauptet, dass es keinen String-Typ in C++ gibt, sondern Strings schlichtweg Arrays aus Zeichen sind. Aber kann ja sein, dass das später nochmal auftaucht.

    Das stimmt auf eine Art schon, aber ein gutes Buch hätte im gleichen Satz erwähnt, dass es std::string gibt, welche den Standardstring in C++ darstellt.

    Nur weil das jetzt kein direktes Feature der Sprache ist, heisst nicht, dass man die Stringklasse (oder besser template) nicht benutzen darf. Es macht durchaus Sinn eine Stringklasse nicht direkt in der Sprache zu implementieren, weil es unnötig ist, da ein string auch nur eine Abstraktion ist. Es ist eine Menge von aneinanderhängender Buchstaben. Und dafür kann man verschiedene Implementierungen vorschlagen, je nach Anforderung und da die Sprache auf einen eingebauten Typen festzulegen macht imo nicht viel Sinn.

    Als Anfänger sollte man sich nicht mit Probleme umschlagen müssen, wie das zuweisen eines char Arrays an ein anderes, was nicht so intuitiv ist, wie viele zuerst meinen. Darum wird Anfängern hier stets geraten die Standardbibliothek und deren Mittel, wie std::string anstatt ein Array von char's oder std::vector anstatt ein Array von irgendwas zu benutzen.

    Später wirst du dann auch das Verständnis bekommen, wie Array funktionieren, warum man da nicht so einfach zuweisen kann und warum sie eine feste Grösse haben. Und dir wird dann das korrekte Einsatzgebiet davon klarer. Und dann wirst du ebenfalls jedem Anfänger abraten das mit Arrays zu machen.

    Nichts desto trotz verstehe ich durchaus, dass du lernen willst, die Arrays funktionieren und wo deine Denkfehler waren. (ich habe am Anfang genau gleich gedacht.)

    Es funktioniert jetzt mittlerweile übrigens. Der Code ging tatsächlich, das Problem lag darin, dass ich strcpy() und auch sprintf() etc. außerhalb von "int main(void){...}" geschrieben hatte. Also nach "using namespace std;" wo ich auch ein paar Variablen definiere, da habe ich gleich meinen Code geschrieben.

    Hehe. Darum poste doch, wenn möglich immer den realen Code. Wie du siehst können lediglich Ausschnitte des Codes mit Fehlermeldung recht Verwirrung stiften, wenn man den Zusammenhang nicht kennt. Wenn wir den gesamten Code gesehen hätten, dann hätten wir dir das gleich sagen können. 😉
    (Wenn möglich reduzier den Code aber auf das wesentliche, wo der Fehler noch drin steckt.)
    Warum das nicht geht, ist denke ich klar, odre? - Die Ausführung des Codes fängt in der main an und hört am Ende der main auf. Alles ausserhalb ist kein ausgeführter Code in dem Sinne, sondern lediglich Definition, Deklaration o.ä.


Anmelden zum Antworten