如何在C ++中按字母顺序对标准输入字符串进行排序?

时间:2016-09-05 05:12:56

标签: c++

#include <iostream> 
using namespace std;

int main (int argc, char **argv)
{
    int i = 0, j = 0;
    string temp;

    for (i = 1; i < argc; ++i)
    {
         for (j = i+1; j < argc; ++j)
         {
              if (argv[i] > argv[j])
              {
                   temp = argv[i];
                   argv[i] = argv[j];
                   argv[j] = temp;
              }
          }
     }
}

我不知道为什么,但是当我编译它时我得到了这个错误。

  

trial2.cpp:109:14:错误:分配给&#39; char *&#39;来自不兼容的类型&#39;字符串&#39; (又名&#39; basic_string,allocator&gt;&#39;)                             argv [j] = temp;                                     ^ ~~~~   // temp是我的临时字符串。

2 个答案:

答案 0 :(得分:3)

代码中有两个错误:

  1. 正如@hyde所指出的那样,temp应该是char*而不是string
  2. argv[i] > argv[j]看起来像指针比较,即它将比较地址的值而不是比较字符串。我建议使用strcmp方法比较两个char*(然后您需要#include <string>才能使用此方法)
  3. 建议的代码(不确定是否完全没有bug,但希望它是这样的):

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main (int argc, char **argv)
    {
        int i = 0, j = 0;
        char* temp;
    
        for (i = 1; i < argc; ++i)
        {
             for (j = i+1; j < argc; ++j)
             {
                  if (strcmp(argv[i] , argv[j]) > 0)
                  {
                       temp = argv[i];
                       argv[i] = argv[j];
                       argv[j] = temp;
                  }
              }
         }
        for(i = 0; i < argc; i++){
            cout << argv[i]<< endl;
        }
    } 
    

    注意最后的for循环是检查输出是否已排序。我尝试了您的比较argv[i] > argv[j]而不是strcmp,但它似乎无法在我的机器上运行。

答案 1 :(得分:1)

错误弹出因为它将string类型转换为char *失败。但它必须颠倒过来(因此你的temp = argv[i];不会失败)。 不要写信argv(你可以,但我不建议)。 简单方法:在排序之前将argv复制到某个string数组: `

string *argv_strings = new string[argc - 1];
for(int i = 0; i < argc - 1; ++i)
{
    argv_strings[i] = new string(argv[i + 1]);
}

`

并使用argv_strings代替argv 不要忘记delete指针。