【发布时间】:2021-04-21 16:30:51
【问题描述】:
您好,我想定义一些自定义语句。例如,在波兰语中,我们有字母 'a' 而不是 'ą' 和 'b',我想做这样的事情
#define a > b && ą > b
我需要这个来比较 if 语句来对单词进行排序,所以这应该像
if(ą > a) //false from define
【问题讨论】:
您好,我想定义一些自定义语句。例如,在波兰语中,我们有字母 'a' 而不是 'ą' 和 'b',我想做这样的事情
#define a > b && ą > b
我需要这个来比较 if 语句来对单词进行排序,所以这应该像
if(ą > a) //false from define
【问题讨论】:
不,你不能那样做。您必须使用(内联)函数或宏之类的函数来做到这一点。如果是为了排序,你应该记住,这将基于字符的整数表示进行排序,这不一定是字母。
【讨论】:
您有一种编程语言的直觉,您可以在其中定义一些事实并在以后以直接的方式使用它们。这是一种比您可以直接用 C 编写的更抽象的表达式级别。您正在寻找的编程语言很可能是 Mathematica。您可以使用它的符号规则替换来建立将抽象集合元素ą 排序在a 之后的规则,然后使用这些规则来获取关于各种元素的相对顺序的语句,即使在更复杂的表达式中(您可以定义字符连接等 - 都是抽象的以及数学家会如何看待它,而不是 C 让您直接表达的内容)。或者您可以只使用 Mathematica 庞大的事实库,例如Alphabet["Polish"] 将波兰小写字母作为列表返回:{"a", "ą", "b", "c", "ć", …, "ż" } - 这可用于建立排序顺序。
如果你想在 C 中这样做,那么:
这些字符在波兰语语言环境中已经具有正确的排序规则。如果您的系统设置为波兰语语言环境,这已经发生了。
要比较字符,不能使用普通的 C 比较运算符,因为它们比较字符的数值,而这些数值与整理顺序没有太大关系。使用 C 的 strcoll 函数来比较字符串(如果您愿意,可以是单字符串!)。
你当然可以自己写一个半生不熟的strcoll,简单的做法可能如下:
#include <assert.h>
#include <wchar.h>
int wcharpos_pl(wchar_t ch) {
static const wchar_t alphabet[] =
L"\0AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻaąbcćdeęfghijklłmnńoópqrsśtuvwxyzźż";
enum { alphabet_size = sizeof(alphabet) / sizeof(alphabet[0]) };
for (int i = 0; i < alphabet_size; ++i)
if (alphabet[i] == ch) return i;
return alphabet_size + (int)ch; // fall back to numerical order outside of the alphabet
}
int wstrcoll_pl(const wchar_t *left, const wchar_t *right) {
while (*left == *right && *left) { // step through strings as long as they are equal
++left;
++right;
}
const int l = wcharpos_pl(*left), r = wcharpos_pl(*right);
if (l < r) return -1;
if (l > r) return 1;
return 0;
}
int main() {
assert(wstrcoll_pl(L"koktajl", L"koktajl") == 0);
assert(wstrcoll_pl(L"Abrakadabra", L"abrakadabra") < 0);
assert(wstrcoll_pl(L"matwa", L"mątwa") < 0);
assert(wstrcoll_pl(L"żurawina", L"źrebak") > 0);
assert(wstrcoll_pl(L"Żur", L"Żurawina") < 0);
assert(wstrcoll_pl(L"ŻURAWINA", L"ŹREBAK") > 0);
assert(wstrcoll_pl(L"źdźbło", L"ździebko") > 0);
}
【讨论】: