当cin需要int时检测char

时间:2014-02-09 01:01:19

标签: c++ types typechecking

当我在学校学习C ++时,这不是一个家庭作业的一个问题,只是我遇到的一个奇怪的事情,我想知道如何为自己和将来的参考解决。

搜索我没有看到任何与此直接相关的内容。

所以我正在寻找int类型的输入,但我注意到在运行一个程序时,如果收到一个char输入(不确定字符串)它转换为int(我在教科书中读到这是正常的C ++行为)。

我的问题是:如何在输入上测试char类型,因为它会自动转换为int?我已经习惯了Python,Ruby,PHP等,其中通常有一些标准的库方法,但在搜索这里和google似乎没有。下面是我发现此问题时所使用的精简版本。

我也想知道:C ++从中获取char的值是什么?是ASCII值还是其他什么?如果您运行下面的代码并输入任何单个字母字符,您将看到我在说什么。

我见过一些包含外部库的解决方案,但希望C ++的标准库/发行版中有一些东西可以解决这个问题。

如果这是相关的:我的系统是OS X 10.8并运行gcc。

谢谢!

#include<iostream>
using namespace std;

int main()
{
    int user_input;
    int n;

    cout << "Enter a number: ";
    cin >> user_input;

    for (n = 0; n < user_input; n++)
    {
        cout << n << endl;
    }

    cout << user_input << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:1)

您应该检查是否有失败的cins:

....
cin >> user_input;
if (cin.fail())
  cout << "Please enter numbers only" << endl;
else
{ // REST of your code }

AFAIK这些值是任意的,并且不对应于ASCII值或任何东西。

答案 1 :(得分:1)

  

如何在输入

上测试char类型

有几种机制可供使用。你可以考虑这两个:


风格1.
'c'样式是用isdigit()检查每个输入字符。 即将用户输入读入字符串,检查每个字符是否为数字等

std::cout << "Enter a number: ";
std::string user_input;
std::cin >> user_input;
for (int i=0; i<user_int.size(); i++
   if (!isdigit(user_input[i])
      throw "not a digit";
// if you get here, all the chars in user_input are digits, 
// I suppose you might use atoi()  to convert, but see next.

注意 - 还有一个十六进制检查,isxdigit()。如果您想允许用户输入逗号或空格字符,您可以对希望允许用户使用的每个字符使用user_input.erase(...),但忽略作为数字的一部分。


风格2。

您可能更喜欢c ++样式,我发现它更容易,但需要熟悉C ++ std :: string方法。

std::cout << "Enter a number: ";
std::string user_input;
std::cin >> user_input;
const char* DIGITS = "0123456789";
size_t notaDigit = user_input.find_first_not_of(DIGITS);
if(notaDigit != std::string::npos)
   throw "non-digit char found in user_input";

// if you get here, all chars are digits, so convert to integer.
// these days, I would do this in 4 steps.
int user_int = 0;
{
   std::stringstream ss;
   ss << user_input; // put char string into ss
   ss >> user_int;   // extract and convert to integer 
} // discard and cleanup the stringstream at scope end

std::cout << "user_int: " << user_int << std::endl;

  

如果接收到char输入(不确定字符串)它是什么   转换为int

仅供参考 - 我无法在ubuntu 12.04上的gcc 4.8.1上重现这一点。

通过std :: cin的字符输入不会转换为int。

转换尝试在第一个非数字字符处停止将数字转换为整数的一部分。因此,33Y将转换为33,因为它在Y处停止转换。 ABC输入(或AB输入或A输入)将在第一个(非数字)字符处停止转换,因此转换报告为0.

我相信某些转换尝试(从字符串到POD)也可以在istream上设置标志,但是没有检查。

示例:

 dmoen@C5:~/cvs-tools/lmbm/src_ut$ ./dmy24
 Enter a number: 12
 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 dmoen@DOMA5:~/cvs-tools/lmbm/src_ut$ ./dmy24
 Enter a number: a 
 0
 dmoen@DOMA5:~/cvs-tools/lmbm/src_ut$ ./dmy24
 Enter a number: bcd
 0
 dmoen@DOMA5:~/cvs-tools/lmbm/src_ut$ ./dmy24
 Enter a number: ABC
 0

请注意,大多数C风格的函数会自动将char提升为int。例如,isdigit()的输入被声明为int,因此促销使其更易于使用。

C ++也支持此促销,但我猜这不是你所看到的。

答案 2 :(得分:0)

尝试将user_input作为c字符串读取,并使用atoi将其转换为int。

那应该有所帮助。