Problem mit Strings, Arrays und Ausgabe



  • Hi @ all
    Ich bin ein neuer C Noob und wollte heute mein erstes richtiges eigenes Programm schreiben.

    Bis jetzt sieht das ganze so aus:

    #include <stdio.h>
    #include <stdlib.h>

    main() {

    int i;
    int x[9];
    int ein;

    for(i=1;i<=9;i=i+1)
    x[i] = " ";

    printf("\t\t Tic Tac Toe \n\n");
    printf("\t {1}\t{2}\t{3}\n");
    printf("\t {4}\t{5}\t{6}\n");
    printf("\t {7}\t{8}\t{9}\n\n");

    printf("Bitte geben Sie einen Punkt ein: \n");
    ein = getchar();

    for (i = 1;i <= 9;i++) {
    if(ein == i)
    x[i] = "X";
    }

    printf("\n Das aktuelle Spiel sieht so aus:\n");
    printf("\t {%s}\t{%s}\t{%s}\n", x[1], x[2], x[3]);
    printf("\t {%s}\t{%s}\t{%s}\n", x[4], x[5], x[6]);
    printf("\t {%s}\t{%s}\t{%s}\n\n", x[7], x[8], x[9]);

    getchar();
    getchar();
    }

    Mein Compiler (Microsoft Toolkit) gibt dann folgendes aus:

    D:\Programme\MS Toolkit\myprog>cl tic.c
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
    Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

    tic.c
    tic.c(19) : warning C4047: '=' : 'int' differs in levels of indirection from 'ch
    ar [2]'
    Microsoft (R) Incremental Linker Version 7.10.3077
    Copyright (C) Microsoft Corporation. All rights reserved.

    /out:tic.exe
    tic.obj

    Zwar gibt es eine Warnung (die ich nicht verstehe) allerdings erstellt er trotzdem eine EXE.

    Beim Ausführen kommt dann das Problem:

    D:\Programme\MS Toolkit\myprog>tic.exe
    Tic Tac Toe

    {1} {2} {3}
    {4} {5} {6}
    {7} {8} {9}

    Bitte geben Sie einen Punkt ein:
    1

    Das aktuelle Spiel sieht so aus:
    { } {4231232} {4231232}
    {4231232} {4231232} {4231232}
    {4231232} {4231232} {4231232}

    Nun ja, ich habe keine Ahnung was diese Zahlen bedeuten und warum nicht mein "X" ausgegeben wird.

    please help



  • mhm ohne das jetzt ganz genau angeguckt zu haben, folgendes ist schonmal falsch:

    int x[9];
    //ändern in
    char x[9];
    
    main()
    {
    //code
    }
    //ändern in
    int main(void)
    {
    //code
    return 0;
    }
    

    und dein compiler hört sich auch ziemlich veraltet an 👍

    edit: mach mal [ cpp] code tags um deinen code!!



  • Ich hab das jetzt nach deinen Vorschlägen verändert, allerdings ist es noch schlechter? geworden:
    Compiler ist Microsoft Toolkit 2003 (aktuellste Version)

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
    int i;
    char x[9];
    int ein ;
    
    for(i=1;i<=9;i=i+1)
      x[i] = " ";
    
    printf("\t\t Tic Tac Toe \n\n");
    printf("\t {1}\t{2}\t{3}\n");
    printf("\t {4}\t{5}\t{6}\n");
    printf("\t {7}\t{8}\t{9}\n\n");
    
    printf("Bitte geben Sie einen Punkt ein: \n");
    ein = getchar();
    
    for (i = 1;i <= 9;i++) {
      if(ein == i)
        x[i] = "X";
    }
    
    printf("\n Das aktuelle Spiel sieht so aus:\n");
    printf("\t {%s}\t{%s}\t{%s}\n", x[1], x[2], x[3]);
    printf("\t {%s}\t{%s}\t{%s}\n", x[4], x[5], x[6]);
    printf("\t {%s}\t{%s}\t{%s}\n\n", x[7], x[8], x[9]);
    
    getchar();
    getchar();
    return 0;
    }
    

    D:\Programme\MS Toolkit\myprog>cl tic.c
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
    Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

    tic.c
    tic.c(20) : warning C4047: '=' : 'char' differs in levels of indirection from 'c
    har [2]'
    tic.c(33) : warning C4047: '=' : 'char' differs in levels of indirection from 'c
    har [2]'
    Microsoft (R) Incremental Linker Version 7.10.3077
    Copyright (C) Microsoft Corporation. All rights reserved.

    /out:tic.exe
    tic.obj

    D:\Programme\MS Toolkit\myprog>tic.exe
    Tic Tac Toe

    {1} {2} {3}
    {4} {5} {6}
    {7} {8} {9}

    Bitte geben Sie einen Punkt ein:
    1

    Das aktuelle Spiel sieht so aus:

    Dann bekomm ich eine Fehlermeldung:
    "tic.exe hat ein Problem festgestellt und muss beendet werden"



  • ein array [n] geht von 0 bis n-1



  • cpfix schrieb:

    x[i] = "X";
    

    ist falsch,

    richtig ist

    x[i] = 'X';
    


  • so weit so gut.
    Der Compiler gibt nun keinen Fehler mehr aus, allerdings bricht das Programm immer noch nach der Eingebe des Punktes ab.

    "tic.exe hat ein Problem festgestellt und muss beendet werden"



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
    int i;
    char x[9];
    int ein;
    
    for(i=0;i<9;i=i+1)
      x[i] = ' ';
    
    printf("\t\t Tic Tac Toe \n\n");
    printf("\t {1}\t{2}\t{3}\n");
    printf("\t {4}\t{5}\t{6}\n");
    printf("\t {7}\t{8}\t{9}\n\n");
    
    printf("Bitte geben Sie einen Punkt ein: \n");
    scanf("%d",&ein);
    
    ein-=1;/*weil man eine zahl eingibt, die als zugriff für den array dienen soll, der array fängt aber bei 0 an und hört bei 8 auf*/
    for (i = 0;i < 9;i++) {
      if(ein == i)
        x[i] = 'X';
    }
    printf("hallo");
    printf("\n Das aktuelle Spiel sieht so aus:\n");
    printf("\t {%c}\t{%c}\t{%c}\n", x[0], x[1], x[2]);
    printf("\t {%c}\t{%c}\t{%c}\n", x[3], x[4], x[5]);
    printf("\t {%c}\t{%c}\t{%c}\n\n", x[6], x[7], x[8]);
    
    getchar();
    getchar();
    return 0;
    }
    

    mfg
    blut-lecker



  • EDIT: Problem gelöst

    Das Programm läuft mittlerweile. Nun habe ich eine Abfrage geschrieben ob man 3 X in einer Reihe hat. Die While Schleife bricht zwar ab, allerdings erst 2 oder 3 Tips nachdem ereits eine Reihe vorhanden ist.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
    int i;
    char x[9];
    int ein ;
    
    for(i=0;i<=8;i=i+1)
      x[i] = ' ';
    
    printf("\t\t Tic Tac Toe \n\n");
    printf("\t {1}\t{2}\t{3}\n");
    printf("\t {4}\t{5}\t{6}\n");
    printf("\t {7}\t{8}\t{9}\n\n");
    
    while((x[0]!='X'&&x[1]!='X'&&x[2]!='X')||(x[3]!='X'&&x[4]!='X'&&x[5]!='X')||(x[6]!='X'&&x[7]!='X'&&x[8]!='X')||(x[0]!='X'&&x[3]!='X'&&x[6]!='X')||(x[1]!='X'&&x[4]!='X'&&x[7]!='X')||(x[2]!='X'&&x[5]!='X'&&x[8]!='X')||(x[0]!='X'&&x[4]!='X'&&x[8]!='X')||(x[2]!='X'&&x[4]!='X'&&x[6]!='X')) {
    
    printf("Bitte geben Sie einen Punkt ein: \n");
    scanf("%d",&ein);
    
    ein--;
    for (i = 0;i <= 8;i++) {
      if(ein == i)
        x[i] = 'X';
    }
    
    printf("\n Das aktuelle Spiel sieht so aus:\n");
    printf("\t {%c}\t{%c}\t{%c}\n", x[0], x[1], x[2]);
    printf("\t {%c}\t{%c}\t{%c}\n", x[3], x[4], x[5]);
    printf("\t {%c}\t{%c}\t{%c}\n\n", x[6], x[7], x[8]);
    
    }
    
    getchar();
    getchar();
    return 0;
    }
    


  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
    int i;
    char x[9];
    int ein ;
    
    for(i=0;i<=8;i=i+1)
      x[i] = ' ';
    
    printf("\t\t Tic Tac Toe \n\n");
    printf("\t {1}\t{2}\t{3}\n");
    printf("\t {4}\t{5}\t{6}\n");
    printf("\t {7}\t{8}\t{9}\n\n");
    
    do{
    printf("Bitte geben Sie einen Punkt ein: \n");
    scanf("%d",&ein);
    
    ein--;
    for (i = 0;i <= 8;i++) {
      if(ein == i)
        x[i] = 'X';
    }
    
    printf("\n Das aktuelle Spiel sieht so aus:\n");
    printf("\t {%c}\t{%c}\t{%c}\n", x[0], x[1], x[2]);
    printf("\t {%c}\t{%c}\t{%c}\n", x[3], x[4], x[5]);
    printf("\t {%c}\t{%c}\t{%c}\n\n", x[6], x[7], x[8]);
    
    /*spiel gewonnen?*/
    if((x[0]=='X'&&x[1]=='X'&&x[2]=='X')||(x[3]=='X'&&x[4]=='X'&&x[5]=='X')||(x[6]=='X'&&x[7]=='X'&&x[8]=='X')||(x[0]=='X'&&x[3]=='X'&&x[6]=='X')||(x[1]=='X'&&x[4]=='X'&&x[7]=='X')||(x[2]=='X'&&x[5]=='X'&&x[8]=='X')||(x[0]=='X'&&x[4]=='X'&&x[8]=='X')||(x[2]=='X'&&x[4]=='X'&&x[6]=='X'))
    break;
    
    }while(1);/*endlosschleife*/
    
    getchar();
    getchar();
    return 0;
    }
    

    das problem bei deiner abfrage war, dass wenn ein X gesetzt war, die bedingung schon nicht mehr erfüllt war.
    Bsp:

    x[0]='X'; x[1]=' '; x[2]=' ';
    dann wird schon aus der while schleife gesprungen, weil x[0]!='X' && x[1]!=' '...
    schon unwahr ist und aus der schleife geprungen wird

    mfg
    blut-lecker



  • Noch ein Tipp, diese Schleife

    ein--;
    for (i = 0;i <= 8;i++) {
      if(ein == i)
        x[i] = 'X';
    }
    

    ist ein bisschen sinnlos. Immerhin ist es nichts anderes als

    x[ein - 1] = 'X';
    

Anmelden zum Antworten