如何检查字符常量是否符合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_ascii
和 ascii_to_native
,然后从那里开始计算。我不会帮你解决这个问题,因为这是一个愚蠢的练习,涉及使用你的实际目标很可能不需要的幻数。
对我的 '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_ascii
和 ascii_to_native
,然后从那里开始计算。我不会帮你解决这个问题,因为这是一个愚蠢的练习,涉及使用你的实际目标很可能不需要的幻数。