如何将字符转换为数字而不是字符
C++ How to cin a char as a number instead of character
我发现自己经常使用包含非常小范围数字的变量(通常从1到10),并且希望通过使用char数据类型而不是int甚至short来最小化我使用的内存量。我想cin值到我的字符变量没有cin转换成它的ASCII等效物,没有单引号工作。例如:
cout<< "Pick from 1 to 10.";
char selection;
cin>> selection;
if (selection == 1) return 1;
等等……
是否有一种通用的方法来做到这一点?同样,我不想使用单引号。
谢谢
您可以创建一个小实用函数:
struct CharReader {
char &c;
CharReader(char &c) : c(c) {}
};
CharReader asNumber(char &c) {
return CharReader(c);
}
template <typename T, typename Traits>
std::basic_istream<T, Traits>& operator>> (std::basic_istream<T, Traits> &str, const CharReader &c) {
short i;
str >> i;
c.c = static_cast<char>(i);
return str;
}
你可以这样使用:
char selection;
std::cin >> asNumber(selection);
节省三个字节(或者零字节,因为编译器很可能会对齐堆栈……)并使代码复杂化以读取数字是没有意义的。只要正常地去做,把你节省内存的努力放在重要的地方(如果你不知道哪里重要,那可能就不重要了)。
int selection;
if(!(cin >> selection) || selection < 0 || selection > 10) {
// hmmm do something about it; perhaps scold the user.
}
place_where_it_is_getting_stored = selection;
char selection;
cin >> selection;
selection -= '0';
Angew的回答呈现了一个有趣而有用的成语:
- 不能被程序以理想的方式直接修改的变量。
- 创建一个实用程序类来保存对变量的引用。 通过类的临时实例中保存的引用修改变量。
之所以有效,是因为程序通过引用对变量有句柄,因此可以修改变量。当引用和类的临时实例一起被销毁时,所引用的变量不受影响。
下面是这个习语的另一个例子。
对于当前的问题,习语也可以这样实现,这样做更简单:
struct CharWidthNum {
char &c;
CharWidthNum(char &c) : c(c) {}
};
// Note: the temporary instance of CharWidthNum can be passed as an rvalue
// reference or as a const reference. It is the variable to which the reference
// variable refers to that is getting modified.
template <typename T, typename Traits>
std::basic_istream<T, Traits> &operator>>(std::basic_istream<T, Traits> &str,
CharWidthNum &&c) {
short i;
str >> i;
c.c = i; // static_cast<char> is not necessary when assigning an
// integer type to char.
return str;
}
程序中
char selection;
std::cin>>CharWidthNum(selection);
我们直接创建了实用结构的临时实例,而不是使用返回该结构副本的实用函数。
也许你应该试试
if (selection - '0' == 1) return 1;
这是在你的情况下最简单的方法
相关文章:
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何检查一个c++字符串中有多少相同的字符/数字
- 当我输入字符类型的数字时,为什么我无法获得整数?
- scanf() 只取数字作为输入,避免使用其他字符
- 递归形成字符串中所有数字字符的中间和?
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 如何在 getline 中删除/忽略超过特定数字的字符?
- C++输出奇怪的字符而不是数字 (Windows)
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- 如何在C++中有效地将数字值重新分配给字符数组
- 我应该以字符形式存储数字以节省内存吗?
- C++ 从 std::string 中删除所有非数字字符
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- 不反转数字的字符反转
- 如何检查字符串是否包含所有这些:数字、字母和特殊字符
- 如果是数字或字符,请检查输入
- 如何将字符更改为数字?
- 生成随机字符/数字
- 如何将 std::string 中的所有非字母字符(数字和特殊字符)替换为空格
- 字符数字 ['0'.."9'] 需要具有连续的数值吗?