c编程珍珠的标准库排序功能

时间:2010-07-21 08:57:03

标签: c

#include <algorithm>
#include <stdio.h>
#include <iostream>



int intcomp(int *x,int *y) {  return *x-*y;};
int a[10000];
int main(void){
    int i; int n=0;
     while (scanf("%d",&a[n])!=EOF)
          n++;
     qsort(a,n,sizeof(int),intcomp);
      for (int i=0;i<n;i++)
           printf("%d\n",a[i]);
       return 0;


}

它只是代码的副本我有两个问题它告诉我intcomp在这段代码中是不兼容的  还有什么intcomp功能? 还有Windows 7 EOF中的内容?如何告诉程序它达到了EOF?

5 个答案:

答案 0 :(得分:4)

qsort()函数需要一个带有特定签名的指针 你的函数签名错误,所以抱怨。

您的功能有签名:

int intcomp(int *x,int *y)

虽然qsort需要签名:

int intcomp(void const* xp,void const* yp)

请注意参数类型的不同。

该功能的更正版本为:

int intcomp(void const* xp,void const* yp)
{
  // Modified for C as the tag on the question changed:
  // int x = *static_cast<int const*>(xp);
  // int y = *static_cast<int const*>(yp);
  int x = *((int const*)(xp));
  int y = *((int const*)(yp));

  return x-y;
}

函数qsort()传递一个函数指针作为第三个参数 此函数指针(在您的情况下为intcomp())用于比较传递的数组中的值。每次调用都提供指向数组的指针。该函数的结果应该是:

Less than 0:    if x is smaller than y
0:              If x is equal to y
Greater than 0: If x is larger than y

答案 1 :(得分:1)

intcomp是一个“Int Compare”函数。它传递一个指向2个int的指针,如果它们是相同的则返回0,正值是x> 1。 y和负值是x <收率

qsort传递一个指向此函数的指针,并在每次想要知道如何对一对值进行排序时调用它。

qsort的文档应该为您提供更多详细信息 例如http://www.cppreference.com/wiki/c/other/qsort

答案 2 :(得分:1)

qsort位于stdlib.h,因此请在开头添加该文件。请注意,不需要algorithmiostream

#include <stdlib.h>

答案 3 :(得分:1)

首先:问题标记为C ++,你#include&lt; algorithm&gt;和&lt; iostream&gt;,但您的代码是100%C。

Martin York已经给出了如何纠正传递给qsort()的函数签名的答案。

然而,“真正的”(TM)C ++解决方案是使用std :: sort&lt;&gt;而不是qsort!

#include <algorithm>    
#include <stdio.h>    

bool intcomp(int a, int b) { return a<b; }
int a[10000];    
int main(void){    
    int n=0;    
     while (scanf("%d",&a[n])!=EOF)    
          n++;    
     std::sort(&a[0], &a[n], intcomp);
      for (int i=0;i<n;i++)    
           printf("%d\n",a[i]);    
       return 0;    
}

请注意,incomp()接受int而不是int指针,并返回bool。就像运营商&lt;()一样。

另请注意,在这种情况下,您可以忘记intcomp并只使用std :: sort(&amp; a [0],&amp; a [n]),这将使用std :: less&lt;&gt ;,将使用运算符&lt;(int,int)。

答案 4 :(得分:0)

正如Martin York所说,qsort需要一个用来比较值的函数:

void qsort( void *buf, size_t num, size_t size, int (*compare)(const void*, const void *) );

以下是有关如何使用qsort的一个很好的示例:http://www.cppreference.com/wiki/c/other/qsort

编辑:Ri更快......