尋找一種經過驗證的工作算法,用於生產。 Did see this example 但在網絡或書籍上找不到其他東西。C中的自然排序 - 「包含數字和字母的字符串數組」
即 file_10.txt> file_2.txt
感謝。
尋找一種經過驗證的工作算法,用於生產。 Did see this example 但在網絡或書籍上找不到其他東西。C中的自然排序 - 「包含數字和字母的字符串數組」
即 file_10.txt> file_2.txt
感謝。
我假設你已經知道C標準庫函數qsort()
:
void qsort(void *base,
size_t nel,
size_t width,
int (*compar)(const void *, const void *);
這最後一個參數是函數指針,這意味着你可以通過任何功能它。事實上,你可以使用strcmp()
,但那會給你ASCII becical,而你特別想要一個自然排序。
在這種情況下,你可以寫一個很容易:如果你只是return
早,但有一個基本的結構
#include <ctype.h>
int natural(const char *a, const char *b)
{
if(isalpha(*a) && isalpha(*b))
{
// compare two letters
}
else
{
if(isalpha(*a))
{
// compare a letter to a digit (or other non-letter)
}
else if(isalpha(*b))
{
// compare a digit/non-letter to a letter
}
else
{
// compare two digits/non-letters
}
}
}
一些else
S的可以被清理。請檢查ctype.h
,查找isalpha()
(如果某個字符是字母表的一部分),isdigit()
,isspace()
等功能。
一個不錯的主意,但有點過於簡單。目前還不清楚爲什麼我打擾寫作和測試代碼...... –
如果我們不知道他的意思是「自然的」,他很難回答這個問題,他忽略了被鏈接的(精心設計的,完全可移植的)版本。 –
基本的排序功能是標準的C qsort()
。它被參數化爲獲取比較函數,並且比較函數是您爲編寫自然排序所需編寫的內容。
您的交叉引用問題包含C實現的比較函數。
谷歌搜索'natural sort c'顯示SourceForge的實現。
我確實看到了源代碼示例,我在windows上。希望更多的測試和使用比較。 –
這是一個(測試)比較功能,可以完成這項工作。這隻能理解無符號整數,沒有符號的整數或浮點數:
#include <stdlib.h>
#include <ctype.h>
/* like strcmp but compare sequences of digits numerically */
int strcmpbynum(const char *s1, const char *s2) {
for (;;) {
if (*s2 == '\0')
return *s1 != '\0';
else if (*s1 == '\0')
return 1;
else if (!(isdigit(*s1) && isdigit(*s2))) {
if (*s1 != *s2)
return (int)*s1 - (int)*s2;
else
(++s1, ++s2);
} else {
char *lim1, *lim2;
unsigned long n1 = strtoul(s1, &lim1, 10);
unsigned long n2 = strtoul(s2, &lim2, 10);
if (n1 > n2)
return 1;
else if (n1 < n2)
return -1;
s1 = lim1;
s2 = lim2;
}
}
}
如果你想與qsort
使用它,用這個輔助功能:
static int compare(const void *p1, const void *p2) {
const char * const *ps1 = p1;
const char * const *ps2 = p2;
return strcmpbynum(*ps1, *ps2);
}
而且你可以的順序上做些什麼
qsort(lines, next, sizeof(lines[0]), compare);
我覺得第一個「return 1」應該是「return -1」。考慮strcmpbynum(「」,「x」)。 –
下面是Qt的一個版本,也支持Unicode:
int strcmpbynum(const QString& s1, const QString &s2) {
int i1 = 0; // index in string
int i2 = 0;
while (true) {
if (s2.length() == i2) // both strings identical or s1 larger than s2
return s1.length() == i1 ? 0 : 1;
if (s1.length() == i1) return -1; // s1 smaller than s2
unsigned short u1 = s1[i1].unicode();
unsigned short u2 = s2[i2].unicode();
if (u1 >= '0' && u1 <= '9' && u2 >= '0' && u2 <= '9') {
// parse both numbers completely and compare them
quint64 n1 = 0; // the parsed number
quint64 n2 = 0;
int l1 = 0; // length of the number
int l2 = 0;
do {
++l1;
n1 = n1 * 10 + u1 - '0';
if (++i1 == s1.length()) break;
u1 = s1[i1].unicode();
} while (u1 >= '0' && u1 <= '9');
do {
++l2;
n2 = n2 * 10 + u2 - '0';
if (++i2 == s2.length()) break;
u2 = s2[i2].unicode();
} while (u2 >= '0' && u2 <= '9');
// compare two numbers
if (n1 < n2) return -1;
if (n1 > n2) return 1;
// only accept identical numbers if they also have the same length
// (same number of leading zeros)
if (l1 < l2) return -1;
if (l1 > l2) return 1;
} else {
// compare digit with non-digit or two non-digits
if (u1 < u2) return -1;
if (u1 > u2) return 1;
++i1;
++i2;
}
}
}
您對哪種自然語言感興趣? –