使用 std::sort 从 'char' 到 'char*' 的无效转换

Posted

技术标签:

【中文标题】使用 std::sort 从 \'char\' 到 \'char*\' 的无效转换【英文标题】:invalid conversion from 'char' to 'char*' using std::sort使用 std::sort 从 'char' 到 'char*' 的无效转换 【发布时间】:2014-09-27 08:45:36 【问题描述】:
 #include <stdio.h>
   #include <algorithm>
   #include <string.h>
   using namespace std;
   #define MAX 1000000
   char s[MAX+1][21],sir[MAX+1];

   bool cmp( char a[21],char b[21]) 
      return strcmp(a, b) < 0;
    

    int main()
    
        FILE *fin,*fout;

        fin=fopen("rocker.in","r");
        fout=fopen("rocker.out","w");

        int i,j,n,k,l,ind;
        char ch;

        fscanf(fin,"%d%d",&n,&k);
        fscanf(fin,"%c",&ch);
        fgets(sir,MAX,fin);

        for(i=0;i<k;i++)
            s[0][i]=sir[i];
        ind=k-1;
        for(i=1;i<n-k+1;i++)
        
            for(j=0;j<k-1;j++)
                s[i][j]=s[i-1][j+1];
            s[i][k-1]=sir[++ind];
        

        sort(s[0],s[n-k+1],cmp);

        for(i=0;i<n-k+1;i++)
        
            j=0;
            while(j<k&&s[i][j]==s[i+1][j])
                j++;
            j--;
            fprintf(fout,"%d\n",j);
        

        return 0;
    

这样做总是给我这个错误,我找不到修复它的方法。

错误:从 'char' 到 'char*' 的无效转换 [-fpermissive]|

我认为这与我将字符串作为参数传递的方式有关。

我已经尝试将char a[21]char * 交换,但这并没有更好。

谢谢!

【问题讨论】:

提供完整代码,无需猜测。 试试sort(s, s+n-k+1, cmp); 使用vectorstring 使用 C++,而不是 C。公平地说,您确实使用了 C++ 标准算法,但不要止步于此。也可以使用它的容器、迭代器和文件 I/O。 【参考方案1】:

你正在这样做:

char s[MAX+1][21];
std::sort(s[0], s[n-k+1], cmp);

sort 函数将交换数组中的元素以使其排序。但它只能交换简单类型,包括指针,而不能交换数组。例如这将失败并且不会复制 21 个字节:

s[2] = s[1]; // error

相反,您必须使用指针为其分配内存。

char * s[MAX+1];
for(int i=0; i<MAX+1; i++)
    s[i] = new char[21];

现在s[i] 只是一个指针,可以与数组中的其他条目交换。

【讨论】:

【参考方案2】:

好的,我认为 sort((char**)s,(char**)(&s[n-k+1]),cmp);是你想要做的。它可以编译但它不能按您预期的那样运行。你应该知道 bool cmp(char a[21],char b[21]) 完全等于 bool cmp(char* a,char* b)。和字符串比较期望 \0 结束

【讨论】:

以上是关于使用 std::sort 从 'char' 到 'char*' 的无效转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::sort 对包含两个数据成员的对象向量进行排序

使用不带前缀“std”且不带“using namespace std;”的 std::sort()编译成功

混淆使用 std::less 和 std::greater 与 std::sort

std::sort 使用继承的仿函数

如何将 std::sort() 与 std::unique_ptr<[]> 一起使用?

C++ 按字母顺序排序字符串