如何将字符转换为数字而不是字符

C++ How to cin a char as a number instead of character

本文关键字:字符 数字 转换      更新时间:2023-10-16

我发现自己经常使用包含非常小范围数字的变量(通常从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;

这是在你的情况下最简单的方法