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

时间:2017-02-05 19:52:34

标签: c++ c ascii language-lawyer ebcdic

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

那么,我应该如何确定连续的字母字符'价值观本身是连续的?或者更确切地说,我如何确定单引号中可以表达的字符常量是否具有数字值的ASCII代码?

我在C和C ++中都询问如何做到这一点。显然C语言也可以在C ++中运行,但如果有一个C ++就可以做到这一点,我也对此感兴趣。另外,我询问最新的相关标准(C11,C ++ 17)。

2 个答案:

答案 0 :(得分:6)

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

#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'保证以连续顺序显示BTW。

答案 1 :(得分:0)

  

...(2)我希望能够获得两个字母之间的字母数量距离......

此评论指明您的目标比您的实际问题更有意义!为什么你没有问过这件事?您可以对字符数组使用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);
  

...我应该如何确定连续的字母字符&#39;价值本身是连续的吗?

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

您的编程方式要好得多,因为您不关心他们拥有的价值。尽管如此,创建一个包含您关注的字符的数组,遍历元素并测试不一致性。例如:

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

...如何确定我在单引号中表达的字符常量是否具有数字值的ASCII码?

再次缺乏理智,再次关注价值观......或者,建立两个翻译表,native_to_asciiascii_to_native,然后从那里开始。我不会帮助你,因为这是一个愚蠢的练习,涉及使用魔法数字,这很可能对你的实际目标来说是不必要的。