[英]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. 但是, qsort
对rytterdata2017
大小的数据进行排序。 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.