strcpy и strcmp, что я делаю не так? - PullRequest
0 голосов
/ 23 января 2012

Пользователь должен ввести несколько строк и ввести пробел в виде строки, когда он закончил. Код должен возвращать самое длинное и самое короткое введенное слово.

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;
}

Ответы [ 5 ]

2 голосов
/ 23 января 2012

Итак, пара вещей:

  • переменные должны быть в нижнем регистре;
  • вы определяете массив строк с неправильной длиной (должно быть 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;
}
2 голосов
/ 23 января 2012

Попробуйте использовать char S [20] [100]; вместо символ S [100] [20];

1 голос
/ 23 января 2012

С cplusplus.com :

Возвращает интегральное значение, указывающее соотношение между строками: нулевое значение указывает, что обе строки равны.Значение больше нуля указывает, что первый не соответствующий символ имеет большее значение в str1, чем в str2;И значение меньше нуля указывает на обратное.

Это не должно быть 1 или -1, попробуйте проверить с> / <0. Также проверьте, заканчивается ли строка, прочитанная из stdio, в '\ 0 'и, в конце концов, добавьте его (getline следует), потому что strcmp использует его. </p>

Кроме того, размер массива в случае ошибки.Должно быть char S[20][100].

0 голосов
/ 24 января 2012

Вы пытаетесь сравнить строки в своем коде, но ваш вопрос говорит, что вы хотите сравнить длину. Используйте strlen для строк с нулевым символом в конце для сравнения длин. Здесь является ссылкой. Еще лучше, если вы пишете код C ++ (как он помечен), то вы уже используете стандартную библиотеку, так что продолжайте и используйте std::string. Это звучит так, как будто это должно быть помечено как домашнее задание, однако в этом случае я предполагаю, что вы не можете использовать класс std::string.

0 голосов
/ 23 января 2012
  1. Вы объявляете свой массив задом наперед; похоже, ты действительно хочешь char S[20][100].
  2. Вам нужно сравнить, используя < 0 и > 0, поскольку strcmp() не гарантирует, что он вернет вам 1 или -1. Из справочной страницы :

    Функции strcmp() и strncmp() возвращают целое число меньше, равно или больше нуля, если s1 (или первое n (байт), соответственно, меньше или соответствует 10 10 * s2 .

...