C++操作 ASCII 中的数字以仅保留在字母范围内
C++ manipulating numbers in ASCII to stay only in range of letters
#include <iostream>
using namespace std;
Int main() {
cout<<"Give me a letter" <<endl;
char letter;
cin>>letter;
cout<<letter;
(Int)letter;
letter+=2;
cout<<(char)letter;
(Int)letter;
letter-=25;
cout<<(char)letter;
return 0;
}
我将如何以某种方式操纵数字,以便数字始终输出一个字母。即:如果选择了字母 Z 并且添加 2 是一个符号,我将如何以某种方式操纵它,使其始终保持在大写数字和非大写数字的数字之间。谢谢。请尽量将答案保持在初学者水平,我是新手。
if(letter > 'z') {
//do stuff
}
if(letter < 'a' && letter > 'Z') {
//do stuff
}
if(letter < 'A') {
//do stuff
}
这只取决于当字符进入ASCII
图表上字符不是字母的三个范围之一时,您希望如何处理该字符。
作为旁注,您不必对int
进行char
来对其进行数学运算。
char myChar = 'a' + 2;
cout << myChar;
这将打印:c
c
的ASCII
值比 a
多 2
最可靠的方法是为每个类别使用一个表,然后您的算术在其索引上,将表的大小取模。因此,对于小写字母,您可以执行以下操作:
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;
}
另一种实现方式是使用以下内容:
results = results + 2;
if ( results > '9' ) {
results -= 10;
}
在上面的if
中。 这两个解决方案在数学上是等效。
这只保证适用于数字,但通常会适用于大写或小写,如果您将自己限制在原始 ASCII 字符集。 (请注意,当今大多数系统支持扩展字符集。
您可以使用
'x'
表示法直接针对 ASCII 字符进行测试。 此外,您可以使用 &&(分别"和")一起测试内容:
if ('a' <= letter && letter <= 'z') {
// Letter is between 'a' and 'z'
} else if ('A' <= letter && letter <= 'Z')) {
// Letter is between 'A' and 'Z'
} else {
// Error! Letter is not between 'a' and 'z' or 'A' and 'Z'
}
或者,您可以使用标准库函数std::isalpha
为您处理此问题:
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'
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- Socklen_t未在此范围内声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- 查找给定范围内最长连续 1 的频率
- "Main"已在当前范围内声明
- c++ 变量在宏的扩展中没有在这个范围内声明
- C++操作 ASCII 中的数字以仅保留在字母范围内