我刚刚在这个答案中发现了一条评论说iostream::eof在循环条件下使用"几乎肯定是错误的".我通常使用类似的东西while(cin>>n)- 我猜是隐式检查EOF,为什么检查eof显式使用while (!cin.eof())错误?
它与scanf("...",...)!=EOF在C中使用有何不同(我经常使用没有问题)?
对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.
谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.
要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:
我是C++的新手,我正在尝试编写一个非常基本的程序,但我遇到了初始化整数的问题.我把它剥离到一个仍然存在问题的非常小的程序:
#include <iostream>
using namespace std;
int main()
{
cout << "Please enter your age\n";
int age = -1;
cin >> age;
cout <<"\n\n Your age is " << age << "\n\n";
}
Run Code Online (Sandbox Code Playgroud)
我看了,如果我尝试输入一个字符串,例如abc在age变量,然后输入要失败和值应单独留在家中,因此它应该打印Your age is -1.
但是,当我运行此程序并键入时abc,它会打印出来Your age is 0.为什么?
我有"cin"行为的问题(我不明白).我的IDE是Windows操作系统下的Netbeans(使用Cygwin).
这是一个代码示例:
int main()
{
int temp = -1;
std::cin >> temp; // here user enters string of characters (string) or a single character
if (temp == 0)
std::cout << "temp = " << temp << ".\n";
if (temp == -1)
std::cout << "temp = " << temp << ".\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我输入某种字符/字符串,此代码显示消息temp = 0.就像转换char为int和转换总是以值0结束.
谢谢你能否解释一下这种行为.
我一直在研究一个问题,即我将浮点数转换为人类可读格式,然后返回.即一个字符串.我使用stringstream遇到了问题,发现atof会产生"更好"的结果.
请注意,在这种情况下我不打印数据,我使用调试器来检索值:
const char *val = "73.31";
std::stringstream ss;
ss << val << '\0';
float floatVal = 0.0f;
ss >> floatVal; //VALUE IS 73.3100052
floatVal = atof(val); //VALUE IS 73.3099976
Run Code Online (Sandbox Code Playgroud)
对此可能有一个合理的解释.如果有人能够启发我,我会很高兴:).
#include <iostream>
using namespace std;
int main()
{
cout << "Please enter your name and age\n";
string first_name;
int age;
cin >> first_name;
cin >> age;
cout << "Hello, " << first_name << " (age " << age << ")!\n";
}
Run Code Online (Sandbox Code Playgroud)
如果我输入Carlos对age或任何其他字符串,我收到了0.这是如何工作的(为什么)?
所以这是一个非常基本的问题和超级微不足道的但我只是通过c ++中的编程原则和实践,我的程序用于读取字符串和int的行为与Bjarne Stroustrup编写的书不同,所以如果他感到惊讶犯了一个错误.无论如何这里是代码:
#include "..\std_lib_facilities.h"
int main()
{
cout << "Please enter your first name and age\n";
string first_name = "???"; // string variable
// ("???” means “don’t know the name”)
int age = -1; // integer variable (1 means “don’t know the age”)
cin >> first_name >> age; // read a string followed by an integer
cout << "Hello, " << first_name << " (age " << age << ")\n";
}
Run Code Online (Sandbox Code Playgroud)
当我在提示符输入"22 Carlos"时它输出"Hello,22(0岁)",基本上使我的错误检查的初始化值无用.这是c ++或其他东西的新功能,这就是为什么这本书出错了?
编辑1:BTW我在Windows 7上使用GCC for cygwin,并且-std = …
此回复的注释指出,不应使用以下代码,因为它表现出未定义的行为:
int old = (std::cin >> old, old);
Run Code Online (Sandbox Code Playgroud)
类似的代码在这里也受到极大的嘲笑,尤其是对于表现出未定义的行为。
另一方面,这个极受好评的答复建议使用以下代码作为逗号运算符的有用性示例:
while (cin >> str, str != "STOP") {
//process str
}
Run Code Online (Sandbox Code Playgroud)
我假设如果此代码表现出未定义的行为,则不会被投票。
问题:如果第一个代码是未定义的行为(大概是由于使用了读取结果cin而不检查后者的状态),那么第二个代码为什么没问题?
编辑:第一个示例的评论部分中回答了该问题。第二个示例未显示的是它str的一个实例,std::string因此已初始化。因此,没有未定义的行为。