4

私はC ++を初めて使用するので、この質問が本当に単純である場合は申し訳ありません。ユーザーがキャンセルという単語を入力するまでサイコロを振って数字を表示するプログラムをC ++で書いていますが、キャンセルを入力してもループが終了しません.hereは私のコードです(私はdev c ++を使用しています):

#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int dice (int);
int main()
{
    char k[7];
    int x;
    do
    {
          cout<<"your dice number is: "<<dice(x)<<endl;
          cout<<"do you want to cancel or continue?";
          cin>>k;
     }while(k!="cancel");
          cout<<"END";
          getch();
}
int dice (int a)
{   
    srand(time(NULL));
    for(int i=1;i<100;i++)
        {
            a=(rand()% 6)+1;
        }
            return a;        
}
4

7 に答える 7

6

実際の文字列の内容ではなくポインターを比較しているため、決して真実ではありません。使用する必要があるさらに別の理由std::string(このための比較演算子は、文字列自体を比較します)。

この比較を行う C の方法は を使用することstrcmpであり、C++ の方法は std::string を使用し、その比較演算子 (つまり ) に依存することoperator==です。ただし、これは C++ とタグ付けされているため、 を使用することを強くお勧めしますstd::string

こちら のドキュメントとstrcmp こちらのドキュメントを見つけることができstd::string ます

于 2013-07-16T21:13:09.203 に答える
3

std::strcmp 関数を使用します。ポインターを文字列リテラルと比較しているだけです。しかし、他の人が言ったように、あなたは本当に std::string を使うべきです。

于 2013-07-16T21:15:12.363 に答える
2
  1. あなたは修正する必要があります

    }while(k!="cancel");
    

    の中へ

    }while(strcmp(k,"cancel")!=0);
    

    すでに C++ を使用している場合は、標準の文字列クラスを使用できます。

    これはstrcmpのリファレンスです。ここには、2 つの C++ 文字列を比較する例があります。

  2. サイコロを複数回投げようとすると、同じランダム値が得られることに気付きます。これは、ランダム性のシードに使用される time() が同じ秒で実行されると同じ秒を返すためです。したがって、次のように移動する必要があります。

    srand(time(NULL));
    

    do while ループの前にメイン関数に追加すると、サイコロを 100 回投げる必要がなくなります。サイコロの 1 行のコードだけで解決できます。

    return (rand()% 6)+1;
    
于 2013-07-16T21:15:44.217 に答える
1

!=生の文字列は、あなたが思っていることをしません。文字列自体を比較するのではなく、ポインタ アドレスだけを比較します。もちろん常に異なります。

strcmpこの場合に使用します。

于 2013-07-16T21:14:39.040 に答える
0

C スタイルの文字列を比較するには、 strcmp関数を使用する必要があります。

 }while(strcmp(k, "cancel") != 0);
于 2013-07-16T21:15:18.167 に答える
0

そのような char 文字列を比較することはできませんstd::string。「k」のポインターを定数「cancel」のポインターと比較しているため、そのように比較できるのは a だけです。を使用する必要がありstrncmpますが、C++ を使用しているため、std:string代わりに a を使用する必要があります。

また、ユーザーが 7 文字を超える文字列を入力すると、バッファがオーバーフローするため、予期しない動作が発生します。使用std::stringすると、これを回避できます。

于 2013-07-16T21:15:40.333 に答える
0

cin>>k だけでなく cin.getline の使用を検討する必要があります。より具体的には、これにより、ユーザーが入力したスペースが考慮されます。

編集:他の多くの人が言及しているように、リテラルではなく文字列を使用する必要があります。

于 2013-07-16T21:14:14.337 に答える