简体   繁体   English

我按字母顺序排列的qsort字符串数组不起作用

[英]My qsort array of strings in alphabetical order won't work

I'm currently having problems with my qsort. 我的qsort目前有问题。 I'm trying to sort an array of strings I read from a file in the qsort function. 我正在尝试对从qsort函数中的文件读取的字符串数组进行排序。 I want it to be read alphabetically, but it isnt working. 我希望按字母顺序阅读它,但是它不起作用。 I would've liked to attached my file as well, but it is very long. 我也想附加我的文件,但是很长。 This is my code: 这是我的代码:

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);
    }
}

The problem is with the parameter size passed to qsort function. 问题在于传递给qsort函数的参数大小。
sizeof(alle_rytterdata2017) will give you size of a pointer to rytterdata2017. sizeof(alle_rytterdata2017)将为您提供指向rytterdata2017的指针的大小。
qsort however sorts data that are of rytterdata2017 size. 但是, qsortrytterdata2017大小的数据进行排序。 You should pass sizeof(arr[0]) or sizeof(rytterdata017) to qsort . 您应该将sizeof(arr[0])sizeof(rytterdata017)传递给qsort

Please include more source code, with struct definitions for future questions. 请包括更多源代码,以及用于将来问题的结构定义。
I have written the following code for testing: 我编写了以下代码进行测试:

#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;
}

Which produces: 产生:

a e 
b a 
c a 
c b 
d a 
d c 

Program below sorts array of strings using pointer to strcmp function which compares strings alphabetically. 下面的程序使用指向strcmp函数的指针对字符串数组进行排序,该函数按字母顺序比较字符串。 Before this just read from file into str array. 在此之前,只需将文件读入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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM