考虑以下两个代码段:
案例1:
#include <iostream>
int main()
{
int i=0;
char c='a';
i=c;
cout << i << endl; //Retuens ASCII value of 'a'
return 0;
}
案例2:
#include <iostream>
int main()
{
cout << "Enter integer value" << endl;
int i=-1;
cin >> i; //Assume user enters 'a'
cout << i << endl; //prints -1 on screen
return 0;
}
在案例1中,当我们使用赋值时,'a'
的ASCII等效值被分配给int i
,但在案例2中int i
是-1
。为什么两种情况下的行为都不同?它是按设计的吗?当为整数变量输入字符时,是否可以(使用标准函数)使用cin
输入ASCII值?
//我明白cin失败了。我想知道的是:为什么cin在输入char时失败,如果赋值正确分配了ascii值?
答案 0 :(得分:5)
如果您输入'a'
,则cin >> i
会失败,因为i
的类型为int
。所以它打印的只是垃圾价值。
你可以写下这个来检查:
if ( cin >> i )
{
cout << i << endl; //on successful read this will be printed!
}
else
{
cout << "cannot read 'a' from input stream";
}
它会打印出来:
无法从输入流
中读取“a”
答案 1 :(得分:2)
如果您想获取从cin
读取的角色的ASCII码,请稍后阅读char
并投射到int
:
char c;
if(cin >> c) {
cout << static_cast<int>(c) << std::endl;
}
答案 2 :(得分:2)
当用户输入'a'
时,运算符实现会尝试将其转换为整数,然后失败。
回应评论(这似乎是你问题的主要观点):
是的,我知道cin失败了。我想知道的是:为什么cin在输入char时失败,如果赋值正确分配了ascii值?
'a'
不是“ASCII值”。在C语言中,它是一个字符文字。
但是cin
不知道字符文字是什么。就cin
而言,用户输入了以下内容:
const char* inputValue = "'a'";
cin
不是C ++编译器。它简单得多,你可能会说愚蠢。当你告诉它以整数形式流时,它将以整数(并且只是整数)流式传输。如果该整数恰好对应于ASCII表中的字符,那么就是这样,但用户必须将其输入为85
。
流输入操作符“愚蠢”的事实实际上是一件好事,因为:
流输入操作符(>>
)不仅用于控制台输入。它们也用于文件输入,需要快速且安全。
答案 3 :(得分:1)
在第一个示例中,您调用operator&lt;&lt;值类型为“int”。 char c='a';
在c中你有一个符号。当你调用i=a;
时,我现在是符号的ASCII码(从char转换为int)。所以cout&lt;&lt;我输出ASCII码。
在第二个例子中 - 整数,当你调用cin >> i
时,它想要读取整数。要阅读某些字符,您可以像这样使用smth
char c;
cin >> c;
现在在c中将是输入字符的代码
答案 4 :(得分:0)
我认为它失败的原因是cin >>
试图为你格式化;所以,如果你在stdin
上输入“10”(字符串),它就能将它放入int中。如果您输入“a”并尝试将其放入int
,则会出错,因为“a”不是有效数字。
考虑使用cin >>
作为输入格式而不使用格式字符串并使用更强大的错误处理;就像scanf一样,当你将“%s”传递给它时,如果你试图使用int作为变量来获取你的字符串参数,则会失败。