C 我的按字母顺序排列的qsort字符串数组赢得了';行不通

C 我的按字母顺序排列的qsort字符串数组赢得了';行不通,c,C,我目前的qsort有问题。我正在尝试对从qsort函数中的文件中读取的字符串数组进行排序。我想按字母顺序读,但它不起作用。我也想附上我的文件,但它很长。这是我的代码: int sammenlign_hold(const void *p1, const void *p2) { rytterdata2017 *resultat1 = (rytterdata2017 *)p1; rytterdata2017 *resultat2 = (rytterdata2017 *)p2;

我目前的qsort有问题。我正在尝试对从qsort函数中的文件中读取的字符串数组进行排序。我想按字母顺序读,但它不起作用。我也想附上我的文件,但它很长。这是我的代码:

int sammenlign_hold(const void *p1, const void *p2) {
    rytterdata2017 *resultat1 = (rytterdata2017 *)p1;
    rytterdata2017 *resultat2 = (rytterdata2017 *)p2;

    if (strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold) == 0)
        return strcmp(resultat1 -> rytterFornavn, resultat2 -> rytterFornavn);
    else
        return strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold);
} 

void opgave_2(rytterdata2017 *alle_rytterdata2017) {
    rytterdata2017 arr[100];

    int k = 0;
    int i = 0; 

    for (i = 0; i < PERSONER; i++) {
        if(strcmp(alle_rytterdata2017[i].nationalitet, "DEN") == 0) {
           strcpy(arr[k].rytterFornavn,    alle_rytterdata2017[i].rytterFornavn);
           strcpy(arr[k].rytterhold, alle_rytterdata2017[i].rytterhold);
           k++;
       }       
   }

    qsort(arr, k, sizeof(alle_rytterdata2017), sammenlign_hold); 

    for (int i = 0; i < k; i++) {
        printf("%s %s \n", arr[i].rytterhold, arr[i].rytterFornavn);
    }
}
int sammenlign_hold(const void*p1,const void*p2){
RyterData2017*结果1=(RyterData2017*)p1;
RyterData2017*结果2=(RyterData2017*)p2;
如果(strcmp(resultat1->rytterhold,resultat2->rytterhold)==0)
返回strcmp(result1->rytterFornavn,result2->rytterFornavn);
其他的
返回strcmp(result1->rytterhold,result2->rytterhold);
} 
无效OPU 2(RyterData2017*alle_RyterData2017){
RyterData2017 arr[100];
int k=0;
int i=0;
对于(i=0;i
下面的程序使用指向按字母顺序比较字符串的strcmp函数的指针对字符串数组进行排序。在此之前,只需将文件读入
str
数组

int main () {
  int i;
  char str[3][10] = {"one", "two", "three"};

  qsort(str, 3, 10, (int(*) (const void*, const void*)) strcmp);

  for(i = 0; i < 3; i++) {
      printf("%s\n", str[i]);
  }

  return 0;
}
int main(){
int i;
char str[3][10]={“一”、“二”、“三”};
qsort(str,3,10,(int(*)(const void*,const void*))strcmp);
对于(i=0;i<3;i++){
printf(“%s\n”,str[i]);
}
返回0;
}

问题在于传递给qsort函数的参数大小。
sizeof(alle_RyterData2017)
将为您提供指向RyterData2017的指针大小。
qsort
但是对
RyterData2017
大小的数据进行排序。您应该将
sizeof(arr[0])
sizeof(rytterdata017)
传递到
qsort

请包含更多源代码,以及结构定义,以供将来提问。
我编写了以下测试代码:

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

typedef struct
{
  char rytterhold[20];
  char nationalitet[20];
  char rytterFornavn[20];
} rytterdata2017;

int sammenlign_hold(const void *p1, const void *p2) {
rytterdata2017 *resultat1 = (rytterdata2017 *)p1;
rytterdata2017 *resultat2 = (rytterdata2017 *)p2;
int temp;
if ((temp = strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold)) == 0) 
return strcmp(resultat1 -> rytterFornavn, resultat2 -> rytterFornavn);
    else
    return temp; 
 // strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold);
 // tip: don't call strcmp twice, it is cpu extensive
}

void opgave_2(rytterdata2017 *alle_rytterdata2017, size_t PERSONER) {
rytterdata2017 arr[100];
int k = 0;
int i = 0;
for (i = 0; i < PERSONER; i++) {
 if(strcmp(alle_rytterdata2017[i].nationalitet, "DEN") == 0) {
           strcpy(arr[k].rytterFornavn,    alle_rytterdata2017[i].rytterFornavn);
           strcpy(arr[k].rytterhold, alle_rytterdata2017[i].rytterhold);
           k++;
       }
   }

 // qsort(arr, k, sizeof(alle_rytterdata2017), sammenlign_hold); // no error, but sizeof(alle_rytterdata2017) is ont size of the object stored in arr
 qsort(arr, k, sizeof(arr[0]), sammenlign_hold);
 // or qsort(arr, k, sizeof(*alle_rytterdata2017), sammenlign_hold);
 // or qsort(arr, k, sizeof(alle_rytterdata2017[0]), sammenlign_hold);
 // or qsort(arr, k, sizeof(rytterdata2017), sammenlign_hold);
 // on my machine:
 // sizeof(alle_rytterdata2017) = 8
 // sizeof(*alle_rytterdata2017) = sizeof(rytterdata2017) = 60

for (int i = 0; i < k; i++) {
printf("%s %s \n", arr[i].rytterhold, arr[i].rytterFornavn);
} }
int
main ()
{
    rytterdata2017 arr[] = {
        {"c","DEN","b"},
        {"a","DEN","e"},
        {"c","DEN","a"},
        {"d","DEN","c"},
        {"d","DEN","a"},
        {"b","DEN","a"},
    };
    opgave_2(arr, sizeof(arr)/sizeof(arr[0]));
  return 0;
}

sizeof(alle_rytterdata2017)
将给出指针的大小,而不是数组契约的大小。您需要传入数组的大小。另外,。作为一名开发人员,了解如何调试程序是至关重要的:@pm100我想也许它应该是
sizeof(*alle_rytterdata2017)
来获取数组类型的大小?@ChristianGibbons我试图将它改为sizeof(*alle_rytterdata2017),但由于某些原因它仍然不起作用。很抱歉再次打扰您,但是你是说我的qsort的结构是错误的,因为你的例子和我的非常不同。另外,感谢您的快速回答。在您的代码中很难读取变量名,所以我发布了这个简短的版本,它也更容易理解。要对数组进行排序,请输入字符串数、每个字符串的大小以及指向要使用的函数的指针。请随意接受这个答案。asker的示例比较了两组字符串,因此仅将strcmp作为比较函数传递给qsort可能不适合他们的需要。注意:
()
sizeof(arr[0])
中不需要
sizeof arr[0]
就足够了。
a e 
b a 
c a 
c b 
d a 
d c