gpt4 book ai didi

c++ - 在 C++ 中使用字符串末尾的整数值对字符串 vector 进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:50 27 4
gpt4 key购买 nike

我有一个包含文件 {"good_6", good_7", "good_8"...,"good_660"} 的目录,在使用 readdir 读取并存储之后在 vector 中我得到 {"good_10", "good_100", "good_101", "good_102"...}

我想要做的是将文件名保留为 {"good_6", good_7", "good_8"...,"good_660"} 在 vector 中,然后将名字替换为1,second 与 2 等等...这样 good_6 将是 1,good_7 将是 2 等等。但是现在 good_10 对应于 1,good_100 对应于 2 等等。

我尝试对 vector 进行 std::sort 但值已经排序,只是不是以我想要的方式排序(基于 _ 之后的整数)。即使我只得到最后一个整数并对其进行排序,它仍将被排序为 1、100、101...

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

您可以使用自定义函数将字符串与数字的特殊情况进行比较:

#include <ctype.h>

int natural_string_cmp(const char *sa, const char *sb) {
for (;;) {
int a = (unsigned char)*sa++;
int b = (unsigned char)*sb++;

/* simplistic version with overflow issues */
if (isdigit(a) && isdigit(b)) {
const char *sa1 = sa - 1;
const char *sb1 = sb - 1;
unsigned long na = strtoul(sa1, (char **)&sa, 10);
unsigned long nb = strtoul(sb1, (char **)&sb, 10);

if (na == nb) {
if ((sa - sa1) == (sb - sb1)) {
/* XXX should check for '.' */
continue;
} else {
/* Perform regular strcmp to handle 0 :: 00 */
return strcmp(sa1, sb1);
}
} else {
return (na < nb) ? -1 : +1;
}
} else {
if (a == b) {
if (a != '\0')
continue;
else
return 0;
} else {
return (a < b) ? -1 : 1;
}
}
}
}

根据您的排序算法,您可能需要用额外的间接级别包装它:

int natural_string_cmp_ind(const void *p1, const void *p2) {
return natural_string_cmp(*(const char * const *)p1, *(const char * const *)p2);
}


char *array[size];

... // array is initialized with filenames

qsort(array, size, sizeof(*array), natural_string_cmp_ind);

关于c++ - 在 C++ 中使用字符串末尾的整数值对字符串 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44688918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com