如何检查字符常量是否符合ASCII?

How do I check whether character constants conform to ASCII?

对我的 早期版本的评论提醒我,我不能假设 'A''B''C' 等。有连续的数值。我曾假设 C 或 C++ 语言标准保证是这种情况。

那么,如何判断连续字母字符的值本身是否连续呢?或者更确切地说,如何确定我可以在单引号内表达的字符常量是否具有其 ASCII 代码作为数值?

我想问一下如何在 C 和 C++ 中执行此操作。显然,C 方式也可以在 C++ 中工作,但是如果有一个 C++ish 工具可以做到这一点,我也对此很感兴趣。另外,我问的是最新的相关标准(C11,C++17)。

您可以使用预处理器检查特定字符是否映射到字符集:

#include <iostream>
using namespace std;

int main() {
    #if ('A' == 65 && 'Z' - 'A' == 25)
    std::cout << "ASCII" << std::endl;
    #else
    std::cout << "Other charset" << std::endl;
    #endif
    return 0;
}

缺点是,你需要提前知道映射值。

数字字符 '0' - '9' 保证按连续顺序出现。

... (2) I expect to be able to obtain the distance in number-of-letters between two letters ...

这条说明您目标的评论比您提出的实际问题更有意义!你为什么不问这个?您可以在字符数组上使用 strchr,并且 strchr 不关心本机字符集是什么,这意味着您的代码不会关心本机字符集是什么......例如:

char alphabet[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
ptrdiff_t fubar = strchr(alphabet, 'y') - strchr(alphabet, 'X');
printf("'X' and 'y' have a distance of %tu and a case difference of %tu\n", fubar / 2, fubar % 2);

... how should I determine whether consecutive letter characters' values are themselves consecutive?

连续字母字符的值根据定义是连续的,因为它们是连续字母字符。我知道这不是你的意思,但你的实际问题说明缺乏计划和思考,而且......一个愚蠢的问题需要一个愚蠢的答案。

您最好以您不关心它们具有什么值的方式进行编程。尽管如此,创建一个包含您关心的字符的数组,遍历元素并测试不一致。例如:

int is_consecutive(char const *alphabet) {
    for (size_t x = 0; alphabet[x] && alphabet[x] + 1 == alphabet[x + 1]; x++);
    return !alphabet[x];
}

... how can I determine whether the character constants I can express within single quotes have their ASCII codes for a numeric value?

再次缺乏理智,再次关注价值观...或者,构建两个转换表,native_to_asciiascii_to_native,然后从那里开始计算。我不会帮你解决这个问题,因为这是一个愚蠢的练习,涉及使用你的实际目标很可能不需要的幻数。