1

私は C 言語を学ぼうとしていますが、ここで助けが必要です。

三目並べゲームのプログラムを作ろうとしています。メイン関数で最初のビットを実行しようとしましたが、うまくいきませんでした。ただし、別の関数を使用すると、機能しました。どのように、そしてなぜそれが機能したのですか?(両方のプログラムを以下に添付します)。

また、scanf で "square 1" と "square 2" の "%c" の代わりに "%s" を使用しました。ここで「%c」が正常に機能しないのはなぜですか?

よろしくお願いします。

// first program


#include <stdio.h>  

int main ()

{

int player;                                         
char square1; 
char square2;
char Nesta[9]={'1','2','3','4','5','6','7','8','9'}; 
int player1;
int player2;


printf("choose one for x or two for o\n");  


scanf("%i", &player); 

if (player==1) 
{
    player1='x';
    player2='o';
}
else
{
    player1 ='o';
    player2='x';
}


printf(
       "1  +  2 + 3   \n"
       "---+----+-----\n"
       "4  +  5 + 6   \n"
       "---+----+-----\n"
       "7  +  8 + 9   \n"
       );


for (int i=0; i<3; ++i)
{
    printf("please enter the number of the sqaure "); 
    scanf("%s",&square1 );

    printf("please enter the number of the sqaure "); 
    scanf("%s",&square2 );

    for (int j=0; j<9; ++j)
    {
        if (square1 == Nesta[j])

        {
            Nesta[j]=player1;
            printf(
                   "%c  +  %c + %c \n"
                   "----+-----+--- \n"
                   "%c  +  %c + %c \n"
                   "----+-----+--- \n"
                   "%c  +  %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
        }
    }


    for (int k=0; k<9; ++k)
    {
        if (square2 == Nesta[k])

        {
            Nesta[k]=player2;
            printf(
                   "%c  +  %c + %c \n"
                   "----+-----+--- \n"
                   "%c  +  %c + %c \n"
                   "----+-----+--- \n"
                   "%c  +  %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],
                                         Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
         }

       }
     }
      return 0; 
   }

gamecont 関数を使用すると問題なく動作します!!

// the second program
#include <stdio.h> 

char Nesta[9]={'1','2','3','4','5','6','7','8','9'}; 
int player1;
int player2;

int gamecont ()
{

char square2;

printf("please enter the number of the square "); 
scanf("%s",&square2 ); 

for (int j=0; j<9; ++j)

    if (square2 == Nesta[j])
      {
        Nesta[j]=player2;
        printf(
               "%c  +  %c + %c \n"
               "----+-----+--- \n"
               "%c  +  %c + %c \n"
               "----+-----+--- \n"
               "%c  +  %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],
                                    Nesta[5],Nesta[6],Nesta[7],Nesta[8]);
        }
    }


int main ()
{

int player;                                         
char square1; 

printf("choose one for x or two for o\n");  

scanf("%i", &player); 

if (player==1) 
{
    player1='x';
    player2='o';
}
else
{
    player1 ='o';
    player2='x';
}


printf(
       "1  +  2 + 3   \n"
       "---+----+-----\n"
       "4  +  5 + 6   \n"
       "---+----+-----\n"
       "7  +  8 + 9   \n"
       );



 for (int i=0; i<3; ++i)
 {
 printf("please enter the number of the square  "); 
 scanf("%s",&square1 ); 

 for (int j=0; j<9; ++j)
 {
   if (square1 == Nesta[j])
    {  
        Nesta[j]=player1;

        printf(
               "%c  +  %c + %c \n"
               "----+-----+--- \n"
               "%c  +  %c + %c \n"
               "----+-----+--- \n"
               "%c  +  %c + %c \n", Nesta[0],Nesta[1], Nesta[2], Nesta[3],Nesta[4],Nesta[5],Nesta[6],Nesta[7],Nesta[8]);

gamecont() ;   
            }
}
  }
 return 0;
}
4

2 に答える 2

2

何かを「うまくいかない」と言うときは、明確にする必要があります。どのような意味で機能しませんか?コンピューターが溶ける?または、予期していなかった特定のことが起こりますか? 次に、具体的にします。

WRT %cvs %s、コンソールからデータを入力するときは「Enter」を押す必要があることに注意してください。これにより、「\ n」文字が標準入力バッファーに送られます。 その '\n' はまだ入力バッファーにあり、次の によって読み取られるのを待っていますscanf

を使用する%s場合、バッファーに改行がある場合、%s文字列には空白が含まれず、ほとんどの型指定子で先頭の空白がスキップされるため、それはスキップされます。ただし、%c常に 1 文字です。検討:

char c;
while (scanf("%c", &c)) printf("%d\n", c);

文字を入力する (Enter キーを押す) たびに、 2 つの数字が表示されます。そのうちの 2 つ目は 10 (ascii \n) です。

残念ながら、%s の使用は安全ではありません。代わりにこれを試してください:

scanf("%c%*c", &square);

手段は無視するため、これ*により改行が削除され、標準入力バッファーが空になります。ただし、ユーザーが複数の文字 (またはスペース) を入力すると、何かが残ります。square文字列を作成して最初の文字だけを使用することもできますが、これにも落とし穴があります。入力バッファーをフラッシュする確実な方法の 1 つは、次のとおりです。

while (fgetc(stdin) != '\n');

scanf を使用した後にこれを行うと、キャプチャ後にバッファ内のすべてが消費され、次回のためにクリアされます。

于 2012-05-28T10:00:15.793 に答える
0

最初のコード ダンプでは、%s を含む c-string を文字変数 (square1 および square2) にスキャンします。これは安全ではありません。c-string を単一の文字ではなく、文字配列にスキャンする必要があります。

于 2012-05-28T09:58:24.390 に答える