2010-07-23 39 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內的其他內容,但它們需要是指針,而不是指針指針。