C++ strcpy和strcmp,我做错了什么?

C++ strcpy和strcmp,我做错了什么?,c++,strcmp,strcpy,C++,Strcmp,Strcpy,用户应该输入一些字符串,并在完成时将空格作为字符串输入。 代码应返回输入的最长和最短单词 strcmp总是返回-1。。。我做错了什么 #include <iostream> #include <cstring> using namespace std; int main() { char S[100][20]; int I = 0; do { cout << "Enter text:" << endl

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

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;
}
#包括
#包括
使用名称空间std;
int main(){
chars[100][20];
int I=0;
做{
cout来自:

返回一个整数值,该值指示 字符串:零值表示两个字符串相等 大于零表示第一个不包含的字符 match在str1中的值大于在str2中的值;并且小于 零表示相反

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

此外,如果数组大小不正确。应为
chars[20][100]

来自:

返回一个整数值,该值指示 字符串:零值表示两个字符串相等 大于零表示第一个不包含的字符 match在str1中的值大于在str2中的值;并且小于 零表示相反

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

另外,如果数组大小不正确。应为
chars[20][100]

尝试使用 chars[20][100]; 而不是 字符S[100][20];

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

  • 您正在向后声明数组;看起来您确实需要
    char S[20][100]
  • 您需要使用
    <0
    >0
    进行比较,因为
    strcmp()
    不保证它将返回1或-1。从:

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

  • 您正在向后声明数组;看起来您确实需要
    char S[20][100]
  • 您需要使用
    <0
    >0
    进行比较,因为
    strcmp()
    不保证它将返回1或-1。从:

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


  • 所以,有几件事:

    • 变量应该是小写的
    • 您正在定义长度错误的字符串数组(应为
      s[20][100]
    • 在你的
      while
      循环中,你应该一直走到
      i<20
    • 数组中的最后一个字符串将始终为空字符串(因此:
      s\u 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;
    }
    
    #包括
    #包括
    使用名称空间std;
    int main(){
    chars[20][100];
    int i=0;
    做{
    
    所以,有几件事:

    • 变量应该是小写的
    • 您正在定义长度错误的字符串数组(应为
      s[20][100]
    • 在你的
      while
      循环中,你应该一直走到
      i<20
    • 数组中的最后一个字符串将始终为空字符串(因此:
      s\u 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;
    }
    
    #包括
    #包括
    使用名称空间std;
    int main(){
    chars[20][100];
    int i=0;
    做{
    
    CUT< P>你试图比较你的代码中的字符串,但是你的问题是你想比较长度。在空结尾的字符串上使用<代码> StLLN <代码>比较长度。是参考。更好的是,如果你写的是C++代码(因为它被标记)。,您已经在使用标准库了,所以请继续使用
    std::string
    。这听起来像是应该标记为家庭作业,但是,在这种情况下,我假设您不能使用
    std::string
    类。

    您试图比较代码中的字符串,但您的问题是要比较长度。请使用
    strlen
    >一个空结尾字符串比较长度。是参考。更好的是,如果你写的是C++代码(因为它是标签),您已经在使用标准库了,所以请继续使用
    std::string
    。这听起来像是应该标记为家庭作业,但是,在这种情况下,我假设您不能使用
    std::string
    类。

    好的,我将其更改为>/<0,并修复了数组大小。但是如果我输入John、David和Leo作为字符串,第一个strcmp仍然是return-1,虽然它显然应该返回正值。而且我不知道如何检查/0。getline()在结尾处添加空字符——在VS2010上查找其余字符现在对我有效,您使用的是哪种编译器?另外,请注意减少I,当您完成输入时,不应该考虑最后一个字符串我使用的是血腥的Dev-C++(我想这是MinGW/GCC)。是的,“i”应该减少1。我使用strlen使其工作,但使用strcmp对我仍然不起作用。尝试使用@StefanoP这里建议的代码。如果两者都不工作,请尝试更新或更改IDE。不幸的是,我熟悉Dev-C++(在学校使用)我可以说这不是KHM的最佳选择。试试VS2010 Express C++,它是免费的,而且比DEV-C++更合适。