使用 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);
使用vector
和string
。
使用 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