【问题标题】:C – Can I Define custom true/false values?C – 我可以定义自定义真/假值吗?
【发布时间】:2021-04-21 16:30:51
【问题描述】:

您好,我想定义一些自定义语句。例如,在波兰语中,我们有字母 'a' 而不是 'ą' 和 'b',我想做这样的事情

#define a > b && ą > b

我需要这个来比较 if 语句来对单词进行排序,所以这应该像

if(ą > a) //false from define 

【问题讨论】:

  • 您可能想阅读strcoll()。使用正确的设置(基本上:正确的语言环境)它会根据需要比较字符串。
  • 不清楚是要比较单个字符还是字符串,以及使用的是什么字符编码。在 UTF-8 中,波兰字母 ą 需要两个字节,因此对 char 值的简单比较可能无法按预期工作。请edit您的问题并添加有关您想要实现的目标的更多详细信息。

标签: c char


【解决方案1】:

不,你不能那样做。您必须使用(内联)函数或宏之类的函数来做到这一点。如果是为了排序,你应该记住,这将基于字符的整数表示进行排序,这不一定是字母。

【讨论】:

  • 好的,我找了一个捷径,但如果不可能,我会做的。
【解决方案2】:

您有一种编程语言的直觉,您可以在其中定义一些事实并在以后以直接的方式使用它们。这是一种比您可以直接用 C 编写的更抽象的表达式级别。您正在寻找的编程语言很可能是 Mathematica。您可以使用它的符号规则替换来建立将抽象集合元素ą 排序在a 之后的规则,然后使用这些规则来获取关于各种元素的相对顺序的语句,即使在更复杂的表达式中(您可以定义字符连接等 - 都是抽象的以及数学家会如何看待它,而不是 C 让您直接表达的内容)。或者您可以只使用 Mathematica 庞大的事实库,例如Alphabet["Polish"] 将波兰小写字母作为列表返回:{"a", "ą", "b", "c", "ć", …, "ż" } - 这可用于建立排序顺序。

如果你想在 C 中这样做,那么:

  1. 这些字符在波兰语语言环境中已经具有正确的排序规则。如果您的系统设置为波兰语语言环境,这已经发生了。

  2. 要比较字符,不能使用普通的 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);
}

【讨论】:

    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多