0

私が取り組んでいるこのプログラムは、スクラブルに似ています。以下のこのプログラムは「ミニプログラム」ですが、2 人のプレイヤーの 7 つの開始タイルを印刷できるはずです。このミニプログラムは完全に機能しているように見えますが、クラッシュするだけです。なぜ実行されないのかについてのアイデアはありますか。お時間をありがとうございました!:D

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <cctype>
using namespace std;

void selectTiles(char (*lettArray)[53], char (*playPieces)[8], char (*compPieces)[8])
{
    int pP1, pP2, pP3, pP4, pP5, pP6, pP7;
    int cP1, cP2, cP3, cP4, cP5, cP6, cP7;
    //0000000

    srand(time(NULL)); 
    rand();

    pP1=rand()%53;
    (*playPieces)[0]=(*lettArray)[pP1];
    strcpy((lettArray)[pP1],"*");

    do{
        pP2=rand()%53;
        (*playPieces)[1]=(*lettArray)[pP2];

    }while(strcmp((lettArray)[pP2],"*")==0);

    do{
        pP3=rand()%53;
        (*playPieces)[2]=(*lettArray)[pP3];
    }while(strcmp((lettArray)[pP3],"*")==0);

    do{
         pP4=rand()%53;(*playPieces)[3]=(*lettArray)[pP4];
    }while(strcmp((lettArray)[pP4],"*")==0);

    do{
         pP5=rand()%53;(*playPieces)[4]=(*lettArray)[pP5];
    }while(strcmp((lettArray)[pP5],"*")==0);

    do{
         pP6=rand()%53;(*playPieces)[5]=(*lettArray)[pP6];
    }while(strcmp((lettArray)[pP6],"*")==0);

    do{
         pP7=rand()%53;(*playPieces)[6]=(*lettArray)[pP7];
    }while(strcmp((lettArray)[pP7],"*")==0);

    do{
         cP1=rand()%53;(*compPieces)[0]=(*lettArray)[cP1];
    }while(strcmp((lettArray)[cP1],"*")==0);

    do{
         cP2=rand()%53;(*compPieces)[1]=(*lettArray)[cP2];
    }while(strcmp((lettArray)[cP2],"*")==0);

    do{
         cP3=rand()%53;(*compPieces)[2]=(*lettArray)[cP3];
    }while(strcmp((lettArray)[cP3],"*")==0);

   do{
         cP4=rand()%53;(*compPieces)[3]=(*lettArray)[cP4];
   }while(strcmp((lettArray)[cP4],"*")==0);

   do{
         cP5=rand()%53;(*compPieces)[4]=(*lettArray)[cP5];
   }while(strcmp((lettArray)[cP5],"*")==0);

   do{
         cP6=rand()%53;(*compPieces)[5]=(*lettArray)[cP6];
   }while(strcmp((lettArray)[cP6],"*")==0);

   do{
         cP7=rand()%53;(*compPieces)[6]=(*lettArray)[cP7];
    }while(strcmp((lettArray)   [cP7],"*")==0);

    //0000000 

 }

int main()
{
    char lettArray[53]="AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ";
    char (*pLetters)[53]=&lettArray;

    char player[8];
    char (*pPlayer)[8]=&player;

    char computer[8];
    char (*pComputer)[8]=&computer;
    selectTiles(pLetters,pPlayer,pComputer); 

    for (int i=0;i<53;i++)
       cout<<"|"<<lettArray[i]<<"|";

     cout<<endl;

    for (int i=0;i<8;i++)
       cout<<"|"<<player[i]<<"|";

     cout<<endl;


     for (int i=0;i<8;i++)
        cout<<"|"<<computer[i]<<"|";

     cout<<endl;
     system("pause");
 }
4

2 に答える 2

1

このプログラムを Cygwin の g++ バージョン 4.5.3 でコンパイルし、それに変更#include <string>した後、#include <cstring>明らかな問題なくコンパイルして実行しました。

しかし、出力を見ると、プログラムが各プレイヤーのスクラブル文字に対して 7 文字ではなく 8 文字を書き込んでいて、各セットの最後の文字が以前に割り当てられていなかったメモリからのものであることが明らかになりました。

したがって、次のような行をお勧めします。

for (int i=0;i<8;i++)

...次のようにする必要があります。

for (int i=0;i<7;i++)

私がまだ見つけていない他のエラーがあるかもしれません。

(編集)

この線:

for (int i=0;i<53;i++)

...余分な文字も出力します。そのはず:

for (int i=0;i<52;i++)

また、 の使用に関するベータ版のポイントを拡大するとstrcpy、が指すアドレスに1 文字ではなく2strcpy(dest,"*")文字がコピーされます。つまり、「*」文字列を終了するヌルをコピーします。これにより、null で上書きされることを意図していないデータが上書きされる可能性があります。dest

于 2013-04-07T04:34:02.833 に答える