0

ユーザーはいくつかの文字列を入力し、完了したら文字列としてスペースを入力する必要があります。コードは、入力された最長および最短の単語を返す必要があります。

strcmp は常に -1 を返します...何が間違っていますか?

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char S[100][20];
    int I = 0;
    do {
            cout << "Enter text:" << endl;
            cin.getline(S[I],100);
    } while (I < 19 && strcmp(S[I++],""));
    char Max[100], Min[100];
    strcpy(Max, S[0]);
    strcpy(Min, S[0]);
    for (int J = 1; J < I; J++) {
        if (strcmp(S[J], Max) == 1)
            strcpy(Max, S[J]);
        if (strcmp(S[J], Min) == -1)
            strcpy(Min, S[J]);
    }
    cout << "Max = " << Max << endl;
    cout << "Min = " << Min << endl;
    system("pause");
    return 0;
}
4

5 に答える 5

2

だから、いくつかのこと:

  • 変数は小文字にする必要があります。
  • 文字列の配列を間違った長さで定義しています ( である必要がありますs[20][100])。
  • あなたのwhileサイクルでは、まで行くべきi < 20です。
  • 配列の最後の文字列は常に空の文字列になります (したがって、:s_minは常に空になります)。
  • strcmpは文字列を比較しますが、どれが最も長いかはわかりません。そのために使うべきstrlen...

ここで作業コード:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
  char s[20][100];
  int i = 0;
  do {
    cout << "Enter text:" << endl;
    cin.getline(s[i], 100);
  } while (i < 20 && strcmp(s[i++],""));

  char s_max[100], s_min[100];
  strcpy(s_max, s[0]);
  strcpy(s_min, s[0]);
  for (int j = 1; j < i-1; j++) {
    if (strlen(s[j]) > strlen(s_max))
      strcpy(s_max, s[j]);
    if (strlen(s[j]) < strlen(s_min))
      strcpy(s_min, s[j]);
  }

  cout << "Max = " << s_max << endl;
  cout << "Min = " << s_min << endl;
  return 0;
}
于 2012-01-23T19:48:27.350 に答える
2

char S[20][100]; を使用してみてください。char S[100][20] の代わりに;

于 2012-01-23T19:21:55.903 に答える
1

cplusplus.comから:

文字列間の関係を示す整数値を返します。ゼロ値は、両方の文字列が等しいことを示します。ゼロより大きい値は、一致しない最初の文字の値が str2 よりも str1 の方が大きいことを示します。ゼロ未満の値はその反対を示しま​​す。

1 または -1 であってはなりません。>/< 0 でテストしてみてください。また、stdio から読み取った文字列が '\0' で終了するかどうかをテストし、最終的にそれを追加します (getline が必要です)。

また、間違っている場合は配列サイズ。する必要がありますchar S[20][100]

于 2012-01-23T19:21:15.077 に答える
0

コード内の文字列を比較しようとしていますが、長さを比較したいという質問があります。strlen長さを比較するには、nullで終了する文字列で使用します。これがリファレンスです。さらに良いことに、作成しているのがC ++コード(タグ付けされている)の場合は、すでに標準ライブラリを使用しているので、先に進んでを使用してstd::stringください。これは宿題のタグを付ける必要があるようですが、その場合はstd::stringクラスを使用できないと思います。

于 2012-01-23T20:08:19.670 に答える
0
  1. 配列を逆方向に宣言しています。本当に欲しいようですchar S[20][100]
  2. < 0と を使用して比較する必要があります。これは、1 または -1 が返されることを保証しないためです> 0マニュアルページstrcmp()から:

    strcmp()および関数は、 s1 (またはその最初のnバイト) がs2strncmp()より小さい、一致する、または大きい場合に、ゼロより小さい、等しい、または大きい整数をそれぞれ返します。

于 2012-01-23T19:22:25.043 に答える