无法在 qsort() 之后循环遍历字符串数组
Cannot loop through array of strings after qsort()
我被这个问题撞到墙上了。
总结一下:
我需要动态地将字符串添加到数组,对它们进行排序,然后检查另一个字符串值。
这需要在支持 C 作为脚本语言但功能有限的 SCADA 系统上运行。我有 qsort() 可用。
但是,根据我的测试代码,我无法在数组上使用 qsort,值是动态添加的。
明确地说,我可以将字符串添加到数组中,效果很好。
但是,当我在该数组上调用 qsort() 时,我无法再打印出索引。
这是目前的代码(请客气,我对 C 不是很精通):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cstring_cmp (const void *a, const void *b)
{
// This function is taken from an online example
const char **ia = (const char **) a;
const char **ib = (const char **) b;
return strcmp (*ia, *ib);
}
int main ()
{
//char *ArchiveKomponents[] = {"R1890L", "F1121D", "F1284Z", "A1238K"};
// If I do the above commented out, it works as intended
char ArchiveKomponents[100][20];
strcpy(ArchiveKomponents[0], "R1890L");
strcpy(ArchiveKomponents[1], "F1284Z");
size_t strLen = sizeof (ArchiveKomponents) / sizeof (char *);
printf ("Len: %zu\n", strLen);
printf ("Before [0]: %s\n", ArchiveKomponents[0]);
printf ("Before [1]: %s\n", ArchiveKomponents[1]);
qsort (ArchiveKomponents, (size_t)strLen, sizeof (char *), cstring_cmp);
printf ("After [0]: %s\n", ArchiveKomponents[0]);
printf ("After [1]: %s\n", ArchiveKomponents[1]);
// When run, the "After" prints are not even printed, the program simply halts
return 0;
}
我觉得我已经用谷歌搜索了整个互联网,寻找如何做到这一点的答案,但没有成功。
此致
您正在比较不正确的类型。比较函数将元素中的 4 或 8 个字符视为指向字符串的指针。取消引用此指针会触发未定义的行为,可能会崩溃。
请注意,单个元素的类型是 char[20]
而不是 char*
。因此,您的比较功能可以简单地实现为:
int cstring_cmp (const void *a, const void *b)
{
return strcmp (a, b);
}
指针 a
和 b
指向 20 个字符的数组。数组的地址与其第一个元素的地址相同。所以 a
和 b
可以用作指向 char
链(又名“c-strings”)的指针。
此外,void*
会自动转换为任何指针类型,无需强制转换。
qsort
调用应该是:
qsort (ArchiveKomponents, // array to be sorted
2, // number of elements in the array
sizeof ArchiveKomponents[0], // size of a single element
cstring_cmp // comparison function
);
我被这个问题撞到墙上了。
总结一下: 我需要动态地将字符串添加到数组,对它们进行排序,然后检查另一个字符串值。
这需要在支持 C 作为脚本语言但功能有限的 SCADA 系统上运行。我有 qsort() 可用。
但是,根据我的测试代码,我无法在数组上使用 qsort,值是动态添加的。
明确地说,我可以将字符串添加到数组中,效果很好。 但是,当我在该数组上调用 qsort() 时,我无法再打印出索引。
这是目前的代码(请客气,我对 C 不是很精通):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cstring_cmp (const void *a, const void *b)
{
// This function is taken from an online example
const char **ia = (const char **) a;
const char **ib = (const char **) b;
return strcmp (*ia, *ib);
}
int main ()
{
//char *ArchiveKomponents[] = {"R1890L", "F1121D", "F1284Z", "A1238K"};
// If I do the above commented out, it works as intended
char ArchiveKomponents[100][20];
strcpy(ArchiveKomponents[0], "R1890L");
strcpy(ArchiveKomponents[1], "F1284Z");
size_t strLen = sizeof (ArchiveKomponents) / sizeof (char *);
printf ("Len: %zu\n", strLen);
printf ("Before [0]: %s\n", ArchiveKomponents[0]);
printf ("Before [1]: %s\n", ArchiveKomponents[1]);
qsort (ArchiveKomponents, (size_t)strLen, sizeof (char *), cstring_cmp);
printf ("After [0]: %s\n", ArchiveKomponents[0]);
printf ("After [1]: %s\n", ArchiveKomponents[1]);
// When run, the "After" prints are not even printed, the program simply halts
return 0;
}
我觉得我已经用谷歌搜索了整个互联网,寻找如何做到这一点的答案,但没有成功。
此致
您正在比较不正确的类型。比较函数将元素中的 4 或 8 个字符视为指向字符串的指针。取消引用此指针会触发未定义的行为,可能会崩溃。
请注意,单个元素的类型是 char[20]
而不是 char*
。因此,您的比较功能可以简单地实现为:
int cstring_cmp (const void *a, const void *b)
{
return strcmp (a, b);
}
指针 a
和 b
指向 20 个字符的数组。数组的地址与其第一个元素的地址相同。所以 a
和 b
可以用作指向 char
链(又名“c-strings”)的指针。
此外,void*
会自动转换为任何指针类型,无需强制转换。
qsort
调用应该是:
qsort (ArchiveKomponents, // array to be sorted
2, // number of elements in the array
sizeof ArchiveKomponents[0], // size of a single element
cstring_cmp // comparison function
);