cin和作业之间的差异
Diffrence between cin and assignment
考虑以下两个代码片段:
案例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正在失败。我想知道的是:如果赋值正确地分配了ascii值,为什么cin在输入char时失败?
如果输入'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">
当用户输入'a'
时,运算符实现试图将其转换为整数,但失败了。
回复评论(这似乎是你问题的要点(:
是的,我知道cin正在失败。我想知道的是:如果赋值正确地分配了ascii值,为什么cin在输入char时失败?
'a'
不是"ASCII值"。在C语言中,它是一个字符文字。
但是cin
不知道文字是什么。据cin
所知,用户输入了以下内容:
const char* inputValue = "'a'";
cin
不是C++编译器。它要简单得多,你可能会争论得更愚蠢。当你告诉它以整数进行流式传输时,它将以整数(并且只有一个整数(进行流式处理。如果该整数恰好对应于ASCII表中的一个字符,那就顺其自然,但用户必须将其输入为85
。
流输入运算符"愚蠢"的事实实际上是一件好事,因为:
- 他们执行得更快
- 对于一个有经验的程序员来说,了解引擎盖下发生的事情更简单
- 你可以确信用户输入了一个数字(更少的bug(
流输入操作符(>>
(不仅仅用于控制台输入。它们还用于文件输入,这需要快速、安全。
如果您想获得从cin
读取的字符的ASCII代码,只需读取到char
中,然后转换为int
即可:
char c;
if(cin >> c) {
cout << static_cast<int>(c) << std::endl;
}
在第一个例子中,您调用运算符<lt;值类型为"int"。char c='a';
在c中有一个符号。当您调用i=a;
时,我现在是符号的ASCII代码(从char转换为int(。所以cout<lt;i输出ASCII代码。
在第二个例子i-integer中,当您调用cin >> i
时,它想要读取integer。要读取某些字符,您可以使用类似的smth
char c;
cin >> c;
现在,c中的代码将是您的输入字符
我相信它失败的原因是cin >>
试图为您格式化;因此,如果你在stdin
上输入"10"(字符串(,它将能够将其放入int。如果你输入"a"并试图将其放入int
,它会给出一个错误,因为"a"不是一个有效的数字。
将cin >>
更多地看作是在没有格式字符串和更稳健的错误处理的情况下进行输入格式化;就像一个scanf,当您将"%s"传递给它时,如果您试图使用int作为变量来获取字符串参数,它将失败。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 将执行、作业和WinAPI相乘
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- cin和作业之间的差异
- 如何使用boost::asio::io_service在c++ 11线程之间调度作业