Wie gebe ich in eine Zeichenkete ein Leerzeichen ein?



  • Ich programmiere als Projekt ein "4 gewinnt" Spiel. Ich habe also ein 2D array (Zeichenkette), mit 7 Spalten und 7 Zeilen. Die von Spieler 1 gesetzten Steine sollen später als X, die von Spieler 2 gesetzten als O dargestellt werden. Während des SPiels füllen sich die Felder mit X`s und O`s. ZU Beginn hätte ich gerne, dass in jedem Feld "nichts" (also ein Leerzeichen) steht. Weiß einer von euch wie ich in die Zeichenkette ein Leerzeichen schreib? Der ASCII Code 0 oder 32 wäre ein Leerzeichen. Wie muss ich diese 0 oder 32 einfügen, damit in der Zeichenkette ein Leerzeichen steht???
    Hier mal meinen kleinen Quellcode:

    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>

    main () {
    int a,b,c,d,e;
    double zeile[7],spalte[7];

    for(c=0; c<=6; c++) { /*Hochzählen der Schachteln*/
    zeile[c]= 😕 ; /*Schreiben eines Leerzeichens in die Zeichenkette*/
    }

    for(a=0; a<=6; a++) {
    printf("\n");
    for(b=0; b<=6; b++)
    printf("I %.0lf ",zeile[b]);

    }
    printf("\n---------------------------"); /*Trennung des Spielfeldes zu den Spaltenbezeichnungen*/
    printf("\nI A I B I C I D I E I F I G "); /*Ausgabe der Spaltenbuchstaben*/
    printf("\n");

    fflush(stdin);
    getchar();
    }

    Wisst ihr, was ich anstelle des 😕 eingeben muss???



  • Du hast kein 2D-Array, du hast da lediglich zwei double-Arrays (wieso denn double??) mit je 7 Elementen. Wenn du Zeichen zum Ausgeben auf dem Bildschirm in einem Array ablegen willst, solltest du auch den passenden Typ auswählen. Das wäre dann char.

    Probier's mal so:

    char spielfeld[7][7];  //char-Array mt 7*7 Elementen
    
    spielfeld[0][0]=32;    //dem erste Element wird eine 32 (Leerzeichen) zugewiesen
    spielfeld[0][0]=' ';   //das gleiche nochmal lesbarer (mach's also lieber so)
    

    ASCII 0 ist übrigens kein Leerzeichen...

    EDIT: Des Weiteren...

    ...solltest du deinen Code, den du hier postest, in [cpp] und [/cpp] einschließen, damit er schön formatier und lesbarer ist.

    ...solltest du sprechende Bezeichner verwenden. Also gerade nicht sowas wie a,b,c,d,e.

    ...musst du in C++ Variablen nicht am Anfang des Scopes deklarieren. Du kannst sie dann deklarieren, wenn du sie brauchst. Das ist übersichtlicher.

    ...kannst du Zählvariablen, die du sowieso nur in einer for-Schleife brauchst, auch direkt dort (im Kopf) deklarieren. Also so:

    for(int i=0;i<x;++i) { /*...*/ }
    


  • Eine 0 einzufügen ist wenig ratsam, eine 0 bedeutet immer: Zeichenkettenende ( auch wenn du hier eine Zeile wohl nicht komplett als String ausgeben willst ).
    Zeichen in einem double Array zu speichern auch nix gut ist, probier es mal mit
    char zeile[7],spalte[7];
    Und für die Initialisierung gibts mehrere Varianten:

    char zeile[7];
    	int i;
    	memset ( zeile, ' ', sizeof(zeile) );  
    	memset ( zeile, 32, sizeof(zeile) );  
    	for ( i = 0; i < 7; i++ )
    		zeile [i] = 32;					 
    	for ( i = 0; i < 7; i++ )
    		zeile [i] = ' ';
    


  • gewinn0r initialisat0r schrieb:

    probier es mal mit
    char zeile[7],spalte[7];

    So hast du doch kein 7*7 Spielfeld...



  • _matze schrieb:

    gewinn0r initialisat0r schrieb:

    probier es mal mit
    char zeile[7],spalte[7];

    So hast du doch kein 7*7 Spielfeld...

    Stimmt.



  • Sorry, für den Patzer, hier die Nachbesserung:

    enum {zeilen=7, spalten = 7};
    int main( )
    {
    	char feld[zeilen][spalten];
    	memset ( feld, ' ', zeilen * spalten * sizeof(feld[0]));
    ...
    


  • Hab mal beides ausprobiert, ich bekomm bei ' ' und bei 32 beides mal die 0 angezeigt. Bilder konnte ich nicht einfügen???? hätte aber gern anstelle der 0 ein "nichts" angezeigt. Oder mach ich da was falsch??? Bin nicht grad ein Profi 😉

    danke für die tips, aber

    enum
    memset

    sagen mir nichts... Müsste da erst ma mich tiefer einlesen...



  • Zehplusplus schrieb:

    Hab mal beides ausprobiert, ich bekomm bei ' ' und bei 32 beides mal die 0 angezeigt.

    Dann machst du etwas falsch, zeig doch mal deinen Ausgabecode.

    Zehplusplus schrieb:

    Bilder konnte ich nicht einfügen????

    Nope, außer Bücherwerbung glaub ich nicht. Extern hochladen und verliken, das geht.

    Zehplusplus schrieb:

    enum
    memset

    sagen mir nichts... Müsste da erst ma mich tiefer einlesen...

    Das ist eine gute Idee ... -
    Hier wird enum lediglich für die Dimensionierung des char Feldes benutzt und memset setzt alle Elemente auf ' '.



  • Zeig mal deinen aktuellen Code. Wenn du '0' angezeigt bekommst, hast du vermutlich auch '0' zugewiesen? Das enum kannst du dir natürlich sparen, lass dich davon nicht verwirren. Und memset brauchst du auch nicht (auch, wenn's eleganter ist), füll dein Array einfach mit Schleifen, wie du das kennst. Mach die Deklaration wie in meinem Beispiel und fülle das Array dann mit 2 verschachtelten for-Schleifen.

    for(int x=0;x<7;++x) {
      for(int y=0;y<7;++y) {
        spielfeld[x][y]=' ';
      }
    }
    
    //alternativ mit memset:
    memset(spielfeld,' ',7*7*sizeof(char));
    


  • Hier mal das Bild wenn ich 32 eingebe:

    Bild Hosted bei ImagesUp.de

    und hier wenn ich ' ' eingebe:

    Bild Hosted bei ImagesUp.de

    irgendwie ähnlich 🙂

    Hab den Beitrag editiert, es war 2 mal das gleiche Bild



  • Lies dir mal die Doku zu printf durch! Du gibst im Formatstring an, dass ein float ausgegeben werden soll. Ein Zeichen gibt man mit %c aus. Übrigens hast du die bisherigen Hinweise nur teilweise umgesetzt (du hast immer noch kein 7*7 Spielfeld), also lies dir besser die geposteten Antworten noch mal ganz genau durch...



  • Gerade die interessante Stelle wird von der Konsole verdeckt.
    Die Formatierungszeichen %0lf sind schonmal fehl am Platz.



  • Deine Einrückung ist auch grauenhaft (sorry 🙂 ), daher hier ein wenig Lektüre:

    http://de.wikipedia.org/wiki/Einrückungsstil



  • Sorry, wenn ich mit den Sachen nicht so zu Recht komme, viele Dinge sagen mir nichts. Ich will mir nicht die Rosinen rauspicken. Bei manchen Tipps hier zeigt mein Programm mir von vornerein Errormeldungen an, weil ich nicht weiß, was ich zusätzlich abändern muss. Deshalb die mehr oder weniger "einfache" Selektion. ZB was genau ist der Formatstring? Muss ma eure Tipss erst mal austesten 😉



  • Ein Formatstring formatiert die Ein/Ausgabe und ist eher ein Sprachmittel von C, in C++ brauchst du den nicht:

    enum {zeilen=7, spalten = 7};
    char feld[zeilen][spalten];
    
    void kuggi()
    {
    	for ( int i = 0; i < zeilen; i++ )
    	{
    		for ( int j = 0; j < spalten; j++ )
    			cout << feld[i][j];
    		cout << endl;
    	}
    }
    
    int main( )
    {
    	memset ( feld, ' ', zeilen * spalten * sizeof(feld[0]));
    	kuggi();		
    	return 0;	
    }
    


  • enum & memset fan schrieb:

    Ein Formatstring formatiert die Ein/Ausgabe und ist eher ein Sprachmittel von C, in C++ brauchst du den nicht:

    Es gibt aber auch für C++-Prpgrammierer u.U. Momente, in denen man mit Formatstrings arbeiten muss (Beispiel CString::Format der MFC). Insofern finde ich schon, dass man ihm das kurz erklären kann, so dass sein Programm läuft. Alles umwerfen und ihm quasi ein komplett anderes Programm vorkauen geht natürlich auch (und deine Version ist sinniger als seine), aber ich fänd' es auch gut, wenn er seine bisher gemachten Fehler versteht und behebt.

    Mit Formatstring meinen wir den String (Zeichenkette), den du als erstes Argument an printf übergibst. Du platzierst dort neben festem Text auch Platzhalter, die dann den Inhalt von Variablen (dir du im Anschluss übergibst) darstellen. Du hast dort %f notiert, was für eine Fließkommazahl steht. Wenn du ein char ausgeben willst, musst du halt %c nehmen.

    Beispiel:

    char c='A';
    int i=65;
    float f=0.123;
    printf("Der Buchstabe %c hat im ASCII-Code den Wert %d und nicht %f!",c,i,f);
    

    (probier's einfach mal aus)

    Doku zu printf:
    http://msdn.microsoft.com/en-us/library/wc7014hz(VS.71).aspx



  • _matze schrieb:

    Du hast dort %f notiert, was für eine Fließkommazahl steht. Wenn du ein char ausgeben willst, musst du halt %c nehmen.

    Ich hab DEN Satz gelesen, das Programm abgeändert, und es geht 😃 😃 😃 😃 Ich hau mich weg 😃 😃 😃

    Hier das Bild, jetz kann ich weiter machen 😃 😃
    Bild Hosted bei ImagesUp.de
    Ich dank euch vielmals, vor allem wegen der Uhrzeit 🙂



  • Schön, dass du weiter kommst. Denk aber bitte daran, die restlichen Tipps nicht komplett zu ignorieren, ja? 😉



  • Ja, jetzt dämmerts mir. Am Anfang war die Zeichenkette ein float, deshalb %f als String (richtig, dass das ein String ist?). Später hab ich ihn hier auf Raten von euch auf einen char abgeändert, und den String %f nicht abgeändert. Der eine Satz wars. Danke, jetz hats sogar der letzte gerafft 😃



  • Zehplusplus schrieb:

    Hier das Bild, jetz kann ich weiter machen 😃 😃
    Bild Hosted bei ImagesUp.de

    Wenn Du jetzt noch statt A-G lieber 1-7 verwendest, benutzt Du sogar die übliche Notation.


Anmelden zum Antworten