【问题标题】:strcpy and strcmp, what am I doing wrong?strcpy 和 strcmp,我做错了什么?
【发布时间】:2012-02-17 03:16:47
【问题描述】:

完成后,用户应输入一些字符串并输入空格作为字符串。 代码应返回输入的最长和最短的单词。

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

【问题讨论】:

  • strcmp 不报告哪个字符串更长或更短。你打算使用strlen吗?
  • 我知道如何让它与 strlen 一起工作,但作业说要使用 strcmp。

标签: c++ strcmp strcpy


【解决方案1】:

所以,有几件事:

  • 变量应该是小写的;
  • 您正在定义长度错误的字符串数组(应为s[20][100]);
  • 在您的while 循环中,您应该一直到i &lt; 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;
}

【讨论】:

  • 变量应该是小写的?这充其量是完全不相关的,最坏的情况是与 C++ 的典型实践不符。
  • 它与编译器无关,它对代码的可读性很重要。在阅读不符合标准的资源时,我真的很头疼。不过,这只是我的看法..
  • mm,所以如果我们谈论代码可修改性,我们还应该考虑变量应该有重要的名称,所以char strings[20][100]而不是char s[20][100]。无论如何,在我看来,在开发大型应用程序时肯定没有这种相关性,但这只是一个练习。
  • 谢谢,虽然我已经使用 strlen 了。作业说要使用strcmp,所以为什么我用它而不是strlen,但不能让它工作。
  • 好吧,这很有道理......我完全同意@dtumaykin(关于代码清晰度还有很多其他的事情要说,例如使用常量或#define),但大写变量是只是我无法忍受......
【解决方案2】:

尝试使用 字符 S[20][100]; 代替 字符 S[100][20];

【讨论】:

    【解决方案3】:

    来自cplusplus.com

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

    它不应该是 1 或 -1,尝试使用 >/

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

    【讨论】:

    • 好的,我把它改成了 >/
    • getline() 将空字符添加到末尾 -- 现在查找其余部分
    • 在 VS2010 上为我工作,你使用的是哪个编译器?另外,当您完成输入后,请注意减少我 - 不应考虑最后一个字符串
    • 我正在使用 Bloodshed Dev-C++(我认为这是 MinGW/GCC)。是的,“我”应该减一。我使用 strlen 使它工作,但使用 strcmp 仍然对我不起作用。
    • 尝试使用@StefanoP 在此处建议的代码。如果两者都不能正常工作,请尝试更新或更改 IDE。不幸的是,我对 Dev-C++(在学校使用过)很熟悉,我可以说它不是 khm 最佳选择。试试 VS2010 Express C++,它是免费的,而且比 Dev-C++ 更体面。
    【解决方案4】:
    1. 您正在向后声明您的数组;看起来你真的很想要char S[20][100]
    2. 您需要使用&lt; 0&gt; 0 进行比较,因为strcmp() 不能保证它会返回1 或-1。来自man page

      如果 s1(或其前 n 个字节)分别被发现小于、匹配或大于 s2

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-10-24
        • 2011-06-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多