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

尝试使用 char S[20][100]; 而不是 char S[100][20];

于 2012-01-23T19:21:55.903 回答
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 回答
1

来自cplusplus.com

返回一个整数值,表示字符串之间的关系:零值表示两个字符串相等。大于零的值表示第一个不匹配的字符在 str1 中的值大于在 str2 中的值;小于零的值表示相反。

它不应该是 1 或 -1,尝试使用 >/< 0 进行测试。另外,测试从 stdio 读取的字符串是否以 '\0' 结尾并最终添加它(getline 应该),因为 strcmp 使用了它。

此外,如果错误,则数组大小。应该是char S[20][100]

于 2012-01-23T19:21:15.077 回答
0
  1. 您正在向后声明您的数组;看起来你真的很想要char S[20][100]
  2. 您需要使用< 0and进行比较> 0,因为strcmp()不能保证它会返回 1 或 -1。从手册页

    如果s1(或其前n个字节)分别小于、匹配或大于s2,则strcmp()andstrncmp()函数返回小于、等于或大于零的整数。

于 2012-01-23T19:22:25.043 回答
0

您正在尝试比较代码中的字符串,但您的问题是要比较长度。strlen在以空字符结尾的字符串上使用以比较长度。是参考。更好的是,如果您正在编写的是 C++ 代码(因为它被标记),那么您已经在使用标准库,所以继续使用std::string. 这听起来应该标记为作业,但是,在这种情况下,我假设您不能使用该std::string课程。

于 2012-01-23T20:08:19.670 回答