0

ボードゲーム「首謀者」のコードを書こうとしています(宿題)。ほぼ本編を書き終わりました。残念ながら、Netbeans でのデバッグでは説明できない不安定な if ステートメントがあります。

次のコードの58 行if目のステートメントは、常に機能するとは限りません。ゲームは次のようになります。

  1. ユーザーは、「ランダムに」生成したい色の数を入力します
  2. ユーザーは色を推測 (コードを壊す) しようとします。
  3. N=4 (たとえば) の場合、ユーザーは 4 色のシーケンスを入力して推測します。4.プログラムは彼が正しかったかどうかをチェックし、フィードバックを返します。

色は、W:白、B:青、G:緑、Y:黄、P:紫、R:赤の6色です。

次のコードは全体の一部にすぎません。この部分で使用していない変数を宣言したり、gets を使用したりすることをお許しください。いくつかの「愚かな」部分もありますが、コードが正常に機能した後に変更されます:) 58行if目のこのステートメントのデバッグを手伝ってもらえますか? (その横にコメントが表示されます)。

コードは次のとおりです。

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

char *colour(char *xr, int N);
int RandomInteger(int low, int high);

int main()
{
    int i,j,q,N,w,z,k,A[6][4],win;
    char *xr,*xrx,temp[1],sur[]="SURRENDER";

    printf("Gimme number from 1-100");
    scanf("%d",&N);
    getchar();

    for(i=0; i<6; i++) A[i][1]=0;
    for(i=0; i<6; i++) A[i][2]=0;
    for(i=0; i<6; i++) A[i][3]=0;
    A[0][0]=87,A[1][0]=66,A[2][0]=71,A[3][0]=89,A[4][0]=80,A[5][0]=82;
    xr=malloc(N*sizeof(char));
    xrx=malloc(N*sizeof(char));
    xr=colour(xr,N);

    printf("\nxr: %s",xr);
    i=0;
    q=0;
    z=1;
    printf("\nGimme the color sequence: ");
    gets(xrx);
    //if(strcmp(xrx,sur)==0) goto end;

    while(xrx[i])
    {
   if(xrx[i]!=87 && xrx[i]!=66 && xrx[i]!=71 && xrx[i]!=89 && xrx[i]!=80 && xrx[i]!=82)               
       {z=0;}
       if(z==0) 
       {
           printf("\nGimme the color sequence: ");
           gets(xrx);
           i=0; 
           z=1;
       }
       else i++;
    }

    i=k=q=0;
    while(xr[i])
    {
    if(xr[i]==xrx[i]) 
    {
            q++;
            for(w=0; w<=5; w++)
            {
                     if(xr[i]==A[w][0]) //SOMETIMES IT DOESN'T WORK
                     {
                             printf("\nhere:");
                             A[w][3]=1;
                             printf("%d",A[w][3]);
                             break;
                     }
            } 
    }
    i++;
    }
    printf("\nColor and position correct: %d",q);
    for(i=0; i<=5; i++) printf("\n%d",A[i][3]); //PERIERGO


   // end:
   printf("!!BYE!!");
   return 0;
}

char *colour(char *xr, int N)
{
    int r,i,j,number;
    char *str,temp[2];

    str=calloc(N,sizeof(char));
    srand((int)time(NULL));
    for(j=0; j<N; j++)
    {
       r=RandomInteger(0,5);
       if(r==0)
       {
           temp[0]='W';
           temp[1]='\0';
           strcat(str,temp);
       }
       else if(r==1)
       {
       temp[0]='B';
       temp[1]='\0';
       strcat(str,temp);
       }
       else if(r==2)
       {
           temp[0]='G';
           temp[1]='\0';
           strcat(str,temp);
       }
       else if(r==3)
       {
           temp[0]='Y';
           temp[1]='\0';
           strcat(str,temp);
       }
       else if(r==4)
       {
           temp[0]='P';
           temp[1]='\0';
           strcat(str,temp);
       }
       else if(r==5)
       {
           temp[0]='R';
           temp[1]='\0';
           strcat(str,temp);
       }
    }
    return str;
}

int RandomInteger(int low, int high)
{
    int k;
    double d;
    d=(double)rand()/((double)RAND_MAX+1);
    k=(int)(d*(high-low+1));
    return (low+k);
}
4

1 に答える 1

4

これは配列の境界を超えてアクセスしているため、未定義の動作が発生します。

for(i=0; i<5; i++) A[i][3]=0;

A寸法があります[5][3]。配列インデックスは、配列内の要素の数であるから0まで実行されます。境界外アクセスの他の発生:N - 1N

A[5][0]=82;

そして関数内color()

char *str,temp[1];
str=malloc(N*sizeof(char)); /*Note sizeof(char) is guaranteed to be 1: omit.*/

/* snip */
temp[1]='\0';

str1つ大きくする必要があります(なぜtemp存在するのかは不明です)。

配列内のすべての要素Aをゼロに設定するためにループする代わりに、集約初期化子を使用します。

int A[5][3] = { { 0 } };

gets 関数が非常に危険なため、使用すべきでないのはなぜですか? を参照してください。

于 2013-01-10T08:58:32.263 に答える