1

今、私はそのような問題に直面しています。ライブラリ関数で「strcmp」を使用せずに2つの文字列を比較します。

関数「mystrcmp」を正しく定義しましたが、入力した文字列を文字配列に入れる必要もあります。どうすればそれを実現できますか?

これが私の間違ったコードです:

char a1[100],a2[100];
int j=0;
do
{
    cin>>a1[j];
    j=j+1;
}while(getchar()!=10);
int k=0;
do
{
    cin>>a2[k];
    k=k+1;
}while(getchar()!=10);

cout<<j<<"  "<<k<<"\n"; 

jとkのループが正しいかどうかを確認したいと思います。残念ながら、結果は間違っています。たとえば、「abcdefg」と「gfedcba」を入力すると、結果は「j = 4、k=4」になります。

私のコードの何が問題になっていますか?どうすれば修正できますか?

お返事をお待ちしております。ありがとうございました。

4

2 に答える 2

1

コードで値 10 を使用しているのはなぜですか? 文字定数の代わりに整数リテラルを使用しないでください。EBCDIC 文字セットを使用するコンピューターでこのコードを実行しようとすると、'\n' の値が 10 ではなく 37 であることがわかります。 ' 10 の代わりに。

getchar と cin コードを混在させないでください。どちらもそれぞれ 1 文字を消費するため、これはかなり悪い考えです。つまり、getchar() は 1 バイトを消費し、cin は 1 バイトを消費するため、ループごとに 2 バイトを消費し、それらのバイトの 1 つだけを保存します。getchar を使用する場合は、次のような意味だと思います。

for (int c = getchar(); c >= 0 && c != '\n'; c = getchar()) {
    a1[j++] = c;
}
a1[j] = '\0';

C++ の cin を使用した同じ種類のこと:

for (int c = cin.get(); cin.good() && c != '\n'; c = cin.get()) {
    a1[j++] = c;
}
a1[j] = '\0';
于 2013-02-26T13:21:45.323 に答える
0

これは危険なコードです。a1 と a2 の範囲外に書き込むことができます。このために作成された関数を使用します。たとえば、cin.getline

http://www.cplusplus.com/reference/istream/istream/getline/

于 2013-02-26T12:15:21.203 に答える