C++ C++;操纵ASCII中的数字,使其仅停留在字母范围内 #包括 使用名称空间std; Int main(){ 库特
这将打印:C++ C++;操纵ASCII中的数字,使其仅停留在字母范围内 #包括 使用名称空间std; Int main(){ 库特,c++,ascii,C++,Ascii,这将打印:c c的ASCII值比a多2个。您可以使用'x'符号直接对ASCII字符进行测试。此外,您还可以分别使用&&(“和”): 最可靠的方法是为每个类别使用一个表,然后 你的算术在它的索引上,以表的大小为模。 因此,对于小写字母,您可以执行以下操作: if (std::isalpha(letter)) { // Letter is between 'a' and 'z' or 'A' and 'Z' } else { // Error! Letter is not betw
c
c
的ASCII
值比a多2个。您可以使用'x'
符号直接对ASCII字符进行测试。此外,您还可以分别使用&&(“和”):
最可靠的方法是为每个类别使用一个表,然后
你的算术在它的索引上,以表的大小为模。
因此,对于小写字母,您可以执行以下操作:
if (std::isalpha(letter)) {
// Letter is between 'a' and 'z' or 'A' and 'Z'
} else {
// Error! Letter is not between 'a' and 'z' or 'A' and 'Z'
}
char
transcode( char original )
{
char results = original;
static std::string const lower( "abcdefghijklmnopqrstuvwxyz" );
auto pos = std::find( lower.begin(), lower.end(), results );
if ( pos != lower.end() ) {
int index = pos - lower.begin();
index = (index + 2) % lower.size();
results = lower[ index ];
}
return results;
}
char
transcode( char original )
{
char results = original;
if ( results >= '0' && results <= '9' ) {
char tmp = results - '0'
tmp = (tmp + 2) % 10;
results = tmp + '0';
}
return results;
}
此解决方案是通用的,无论集合如何,都可以工作
要处理的字母数。对于数字(以及大写和小写)
小写,如果您不太担心可移植性),您可以
可以利用代码点是
然后,执行以下操作:
if (std::isalpha(letter)) {
// Letter is between 'a' and 'z' or 'A' and 'Z'
} else {
// Error! Letter is not between 'a' and 'z' or 'A' and 'Z'
}
char
transcode( char original )
{
char results = original;
static std::string const lower( "abcdefghijklmnopqrstuvwxyz" );
auto pos = std::find( lower.begin(), lower.end(), results );
if ( pos != lower.end() ) {
int index = pos - lower.begin();
index = (index + 2) % lower.size();
results = lower[ index ];
}
return results;
}
char
transcode( char original )
{
char results = original;
if ( results >= '0' && results <= '9' ) {
char tmp = results - '0'
tmp = (tmp + 2) % 10;
results = tmp + '0';
}
return results;
}
在上面的if
中。这两个解在数学上是一致的
相当于
这只保证对数字有效,但通常
如果你把自己限制在最大的范围内,那就用大写或小写
原始ASCII字符集。(请注意,当今大多数系统
支持扩展字符集。)怎么了?@IInspectable完全没有问题,我只是认为初学者应该在走路之前学会爬行。无论如何,我会把它作为附录添加,谢谢!@IInspectable最初的海报提到了一些事情,比如给数字加上一个值,这表明他期待的是一个连续的集合。std::I不能保证这一点salpha
,除非你在“C”
地区(通常不是我工作过的地方),结果将不是一个连续的集合。@IInspectable当然,如果letter
的类型为char
,则使用它调用std::isalpha
的单参数版本是未定义的行为。@James我看不到未定义的行为。当然,从char
到int
的整数类型升级是可以定义的ned.我遗漏了什么?如果letter
是ee
?提示:像'a'和'a'这样的字符文字是实际计算符号的ASCII码的快捷方式。因此char c1='',c2=32,c3=0x20;
都产生具有相同ASCII码的字符。
char
transcode( char original )
{
char results = original;
if ( results >= '0' && results <= '9' ) {
char tmp = results - '0'
tmp = (tmp + 2) % 10;
results = tmp + '0';
}
return results;
}
results = results + 2;
if ( results > '9' ) {
results -= 10;
}