ショッピングモール  Personal Health / Stress ( Anger Management )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4944

プログラムの間違いを指摘していただけないでしょうか…
投稿者---山田(2005/11/25 16:45:38)


まず、初めに私は初心者ですので、
間違いについて細かく教えていただけると、すごく嬉しいです。
今回、対戦型五目ならべのプログラムをCPad for Borlandで
書いたのですが、
何やらうまく動きません。
おかしい箇所はおそらく、後攻の番の
scanfでjを読み込めてない(直後にprintfで出力したらiしかでてこなかった。)のですが、
原因がわかりません。どなたか教えていただけないでしょうか?

#include<stdio.h>
#define m 16

main()
{
    int g, r;
    int me[m][m];
    char a, b, i, j;

    printf("   a b c d e f g h i j k l m n o\n");               
    for(a='A';a<='O';a++)
    {
        printf(" %c", a);
        for(b='a';b<='o';b++)
        {
            g=a-64;
            r=b-96;
            me[g][r] = 0;
            if(me[g][r]==0)
            printf(" +");
        }
        printf("\n");
    }

    while(1)
    {
    label1:
        printf("先攻の番です。何行目の何列目に置きますか??\n");
        scanf("%c%c", &i ,&j);
        g=i-64;
        r=j-96;
        if(me[g][r]==1 || me[g][r]==2)
            {
                printf("そこにはすでに置石があります。\n");
                goto label1;
            }
        me[g][r] = 1;
        printf("   a b c d e f g h i j k l m n o\n");
        for(a='A';a<='O';a++)
        {
            printf(" %c", a);
            for(b='a';b<='o';b++)
            {
                g=a-64;
                r=b-96;
                if(me[g][r]==0)
                    {printf(" +");}
                if(me[g][r]==1)
                    {printf(" @");}
                if(me[g][r]==2)
                    {printf(" O");}
            }
            printf("\n");
        }

    label2:
        printf("後攻の番です。何行目の何列目に置きますか??\n");
        scanf("%c%c", &i ,&j);                            /*<----ここです!!*/
        g=i-64;
        r=j-96;
        if(me[g][r]==1 || me[g][r]==2)
            {
                printf("そこにはすでに置石があります。\n");
                goto label2;
            }
        me[g][r] = 2;
        printf("   a b c d e f g h i j k l m n o\n");
        for(a='A';a<='O';a++)
        {
            printf(" %c", a);
            for(b='a';b<='o';b++)
            {
                g=i-64;
                r=j-96;
                if(me[g][r]==0)
                    {printf(" +");}
                if(me[g][r]==1)
                    {printf(" @");}
                if(me[g][r]==2)
                    {printf(" O");}
            }
            printf("\n");
        }
    }
    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:プログラムの間違いを指摘していただけないでしょうか… 4946 nop 2005/11/25 16:52:00


No.4946

Re:プログラムの間違いを指摘していただけないでしょうか…
投稿者---nop(2005/11/25 16:52:00)


>おかしい箇所はおそらく、後攻の番の
>scanfでjを読み込めてない(直後にprintfで出力したらiしかでてこなかった。)のですが、
>原因がわかりません。どなたか教えていただけないでしょうか?

前の入力の改行文字が読み込まれたのでしょう。
fgets()で1行を読み込み、sscanf()で解析すると良いのでは?


この投稿にコメントする

削除パスワード

No.4947

Re:プログラムの間違いを指摘していただけないでしょうか…
投稿者---山田(2005/11/25 16:57:57)


fgets()、sscanf()関数の両方とも使いこなせてないので、
また勉強しなおして質問させていただきます。
が、1つだけ質問してもよろしいでしょうか?
scanf()で改行コードが読み込まれてるということは、
scanf()は2つ続けて使えないということでしょうか?


この投稿にコメントする

削除パスワード

No.4948

Re:プログラムの間違いを指摘していただけないでしょうか…
投稿者---REE(2005/11/25 18:42:15)


>scanf()で改行コードが読み込まれてるということは、
>scanf()は2つ続けて使えないということでしょうか?

そんなことはありません。
%cは改行コードも取り込むため、気をつける必要があるというだけです。

"%c%c"の代わりに" %c%c"としてみてください。
書式のスペースが空白文字(改行コードも含まれる)を読み飛ばしてくれます。

しかし、fgetsとsscanfの方がよいプログラムになるのは確実です。
scanfだけでは、正しくない入力で破綻してしまいます。
(一人目が1文字又は、3文字入れてしまったら・・・)



この投稿にコメントする

削除パスワード

No.4949

Re:プログラムの間違いを指摘していただけないでしょうか…
投稿者---かずま(2005/11/25 18:43:22)


> scanf()で改行コードが読み込まれてるということは、
> scanf()は2つ続けて使えないということでしょうか?

scanf(" %c %c", &i, &j); としてみてください。
書式のスペースが改行やタブなどを読み飛ばしてくれます。


この投稿にコメントする

削除パスワード

No.4950

Re:プログラムの間違いを指摘していただけないでしょうか…
投稿者---山田(2005/11/25 22:15:58)


大変勉強になりました。nopさん、REEさん、かずまさんありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity