【问题标题】:C++ How to cin a char as a number instead of characterC ++如何将字符转换为数字而不是字符
【发布时间】:2013-04-22 06:53:33
【问题描述】:

我发现自己经常使用包含非常小的数字范围(通常从 1 到 10)的变量,并且希望通过使用 char 数据类型而不是 int 甚至 short 来最小化我使用的内存量。我想将 cin 值添加到我的 char 变量中,而不需要 cin 将其转换为它的 ASCII 等价物并且不使用单引号。即如下:

cout<< "Pick from 1 to 10.";

char selection;

cin>> selection;

if (selection == 1) return 1;

等等……

有没有一种通用的方法来做到这一点?同样,我不想使用单引号。

谢谢

【问题讨论】:

  • 您担心在执行控制台 I/O 的程序中为局部变量节省大约 3 字节的内存?
  • 我认为你不能。你必须用'0'减去它。用 cin>>char 无法避免这种情况
  • char 到实际int 的转换代码至少需要2 个字节,我可以向你保证。而且更有可能需要 5 个字节。

标签: c++ char cin


【解决方案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);

【讨论】:

  • 很麻烦。我觉得“批准这个”是非常有争议的。无论如何,为努力+1。也许它会教 OP/其他人运用一点独创性来解决问题。
  • 它会保存 OP 写的那三个宝贵的字节吗?嗯,我想知道 C++ 编译器是否可以优化对象构造。
  • @Joker_vD 是的,他们可以优化它。无论如何,我理解 OP 的担忧是他们有包含此类 chars 的数据结构并希望加载到其中,而本地变量 char 只是一个示例。当然,如果最初的目标实际上是在堆栈上为本地 var 保存 3 个字节,那么上面的内容是毫无意义的(顺便说一句,其他任何事情都是如此)。
【解决方案2】:
char selection;
cin >> selection;
selection -= '0';

【讨论】:

    【解决方案3】:

    保存三个字节(或零,因为编译器很可能无论如何都会对齐堆栈......)并使您的代码复杂化以读取数字是没有意义的。只需正常进行,并将节省内存的努力放在重要的地方(如果你不知道重要的地方,它可能无关紧要)。

    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;
    

    【讨论】:

    • 令人惊讶的是,您将如何成为第一个在这样一个微不足道的主题上发布正确/有用答案的人 :) 让我们假设措辞让人们走错了路 o.O
    【解决方案4】:

    也许你应该试试

    if (selection - '0' == 1) return 1;
    

    根据您的情况,这是最简单的方法

    【讨论】:

    • 用户将很难选择选项 10。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多