2010-07-23 40 views
0

这里是代码打印复制M次打印最长的字符串复制M次

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

using namespace std; 
#define M 1 
#define MAXN 5000000 
char c[MAXN],*a[MAXN]; 
int pstrcmp(char **p,char **q){ return strcmp(*p,*q) ;} 
int comlen(char *p,char *q){ 

    int i=0; 
    while (*p &&(*p++==*q++)){ 
     i++; 
    } 


     return i; 


} 
int main(){ 

    int maxlen=-1; 
    int maxi; 
     int ch,n=0; 
     while ((ch=getchar())!=EOF){ 
      a[n]=&c[n]; 
      c[n++]=ch; 
     } 
     c[n]=0; 
     qsort(a,n,sizeof(char *),pstrcmp); 
     for (int i=0;i<n-M;i++) 
       if (comlen(a[i],a[i+M])>maxlen){ 
        maxlen=comlen(a[i],a[i+M]); 
        maxi=i; 
       } 
       printf("%.*s\n",maxlen,a[maxi]); 



    return 0; 
} 

但这里最长的字符串是错误

1>c:\users\david\documents\visual studio 2010\projects\longest_repeted\longest_repeated.cpp(33): error C2664: 'qsort' : cannot convert parameter 4 from 'int (__cdecl *)(char **,char **)' to 'int (__cdecl *)(const void *,const void *)' 
1>   None of the functions with this name in scope match the target type 
+0

[通过在C的qsort时警告](可能重复http://stackoverflow.com/questions/2561697/warning-when-using-qsort -in-c) – kennytm 2010-07-23 07:40:17

+0

**永远不要**使用宏('#define')来创建const。 – 2010-07-23 08:06:20

回答

1

变化

int pstrcmp(char **p,char **q){ return strcmp(*p,*q) ;} 

int pstrcmp(const void *p, const void *q) 
{ 
    return strcmp(*reinterpret_cast<const char**>(p), *reinterpret_cast<const char**>(q)); 
} 
+0

它不起作用 – 2010-07-23 07:46:11

+1

我喜欢你能够解密错误信息的方式。 :-) – 2010-07-23 08:30:25

0

貌似的pstrcmp签名是错误的 - 应该采取三分球,不是指针指针。

1

您的排序功能需要采取(void*,void*)而不是(char**,char**)。如果需要,您可以将指针转换为sort func内的其他内容,但它们需要是指针,而不是指针指针。