首页 > 解决方案 > 格式化如何解决操作数编译错误

问题描述

关于 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” >> hr >> mins >> secs 的编译错误;我期望完美的代码..但是这段代码有关于操作数的编译错误

标签: c++

解决方案


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) 中这样做:这可能会导致名称冲突,并且用户使用(在这种情况下被迫使用)您的header 不能再摆脱了。

您不检查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;

同样输入字符串;您可以输出单个字符串所期望的内容,只需删除格式,然后读取三个整数(这些整数必须不带冒号输入,它们之间用空格分隔 - 如果您想要冒号,则需要单独读取它们! )。对用户更友好的是给一些用户输入分别为每个值接下来要输入的内容- 类似于其他答案中呈现的内容。

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


推荐阅读