当我在学校学习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;
}
答案 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。
那应该有所帮助。