格式化如何解决操作数编译错误

时间:2018-12-31 03:36:10

标签: c++

关于c ++操作数的错误

我没有关于此的数据

#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;
int main()
{

    double hr, mins, secs;
    cin >> "time remaining: %02d::%02d::%02" >> hr >> mins >>  secs;    //first ">>" is error point. 
    cout << "time remaining: %02d::%02d::%02" << hr << mins << secs << endl;


    system("pause");
    return 0;
}

在此代码中,有关操作数的编译错误 cin >>“剩余时间:%02d ::%02d ::%02” >>小时>>分钟>>秒; 我期望有完美的代码..但是此代码具有关于操作数的编译错误

2 个答案:

答案 0 :(得分:1)

cin >> "time remaining: %02d::%02d::%02" >> hr >> mins >>  secs;

从技术上讲是纯净的:没有operator>>重载接受char const*。从更高的角度来看,这无论如何都是没有意义的:operator>>旨在修改传递给的参数,但是char const*数据是不可变的(如果是字符串文字或指向const数组的指针则是真正不可变的,或者仅是虚拟的,但仍然)。

您最有可能打算这样做:

cin << "time remaining: %02d::%02d::%02"; // out put task to user
                                          // (maybe prepend "please enter ")
cin >> hr >> mins >>  secs;
cout << "time remaining: %02d::%02d::%02" << hr << mins << secs << endl;
//                                      ^ add some whitespace?

还有其他一些问题:

#include <stdlib.h>
#include <string.h>

通常可以正常工作的C ++标头为:

#include <cstdlib>
#include <cstring>

using namespace std被认为是不良做法。尽管它在源文件(.cpp)中不会受到太大影响,但 永远不要 在头文件(.h)中进行处理:这可能导致名称冲突,并且使用( forced 在这种情况下要使用的用户)您的标头将无法删除。

用户输入后,您无需检查std::cin的流状态。但是,用户可能输入了无效数据,例如10y 12z 7% –流在首次发现无效输入并在此后停止读取时将设置fail标志。在C ++ 11之前,它保持输入变量不变,之后,将它们设置为0。无论如何,您将对无效输入进行操作。您可以在所有输入之后检查一次并有可能退出(如果错误发生在什么地方无关紧要),或者您可以在每次输入之后进行检查(更多的工作,但是可以进行更细粒度的错误处理)。

您似乎习惯了printf函数家族。请注意,C ++输入/输出流不了解格式字符串。所以

cout << "time remaining: %02d::%02d::%02" << hr << mins << secs << endl;

假设输入为10、12、7,将为您提供准确的信息:

time remaining: %02d::%02d::%0210127

不幸的是,使用流的C ++输出格式化迅速变得难看。您可以通过

获得(可能)所需的输出
std::cout << "time remaining: " << std::setfill('0') << std::setw(2) << hr
     << "::" << std::setw(2) << mins << "::" << std::setw(2) << secs << std::endl;

类似地,输入字符串;您可以输出单个字符串期望的内容,只是删除格式,然后读入三个整数(必须输入不带冒号的空格,它们之间用空格分隔–如果您要冒号,则需要分别读取它们! )。更加用户友好的方式是,为用户输入分别为每个值接下来要输入的内容–与other answer中显示的内容类似。

最后:system("pause");也许很方便,但是保持外壳窗口打开不是可执行文件的任务。它仅防止您的应用程序在Shell脚本中可用。如果您只是在玩耍,虽然也许可以接受(但是您可能会习惯),但是不要在生产性代码中使用它。

答案 1 :(得分:0)

int hr, mins, secs;
cout << "Input the hours: " << flush;
cin >> hr;
cout << "Input the minutes: " << flush;
cin >> mins;
cout << "Input the seconds: " << flush;
cin >> secs;
cin.get();
system("cls");
cout << "time remaining: " << hr << "::" << mins << "::" << secs << endl;
cin.get();