忽略输入字符

时间:2016-04-22 10:06:15

标签: c++ iostream

所以,我想使用cin.ignore(200,' \ n')输入一行并将其保存到字符串中而不保存\ n作为字符串。但是当我这样做时:

void sendRequest();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    sendRequest();
    return a.exec();
}

void sendRequest(){

  QNetworkProxyFactory::setUseSystemConfiguration(true);



    QEventLoop eventLoop;


    QNetworkAccessManager mgr;


     QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));

    // the HTTP request
    QNetworkRequest req( QUrl( QString("https://mapi.alipay.com/gateway.do?_input_charset=UTF-8&currency=USD&notify_url=10.237.221.84:80&out_trade_no=123456789&partner=2088101122136241&sign=760bdzec6y9goq7ctyx96ezkz78287de&subject=Coke&sign_type=MD5&service=create_forex_trade&total_fee=0.01") ) );
    QNetworkReply *response = mgr.get(req);


    eventLoop.exec(); // blocks stack until "finished()" has been called

    if (response->error() == QNetworkReply::NoError) {

        //success
        qDebug() << "Success\n\n\n\n" << response->readAll();



        delete response;
    }
    else {
        //failure
        qDebug() << "Failure" <<response->errorString();
        delete response;
    }
}

它要求我输入两次,但我只想问我一次并将其保存到名称中。

我已经读过关于cin.clear()的一些内容,但我认为这不是我需要的东西,或者也许,我很想念那个清楚的东西。

谢谢!

2 个答案:

答案 0 :(得分:2)

cin.ignore(n, ch) std::cin关联的流中丢弃字符,直到跳过n个字符,或者直到看到ch为止。 cin.ignore(200, '\n');正在丢弃第一个输入,直到换行符。然后你会得到一条线,它会接受你的第二次输入。

如果您希望在执行空格分隔的输入操作后立即读取行,则可能需要使用cin.ignore(n, ch);构造,例如

int i = 0;
std::cin >> i; // reads an integer, possibly leaving a '\n' in the stream
std::cin.ignore(200, '\n'); // reads and discards until a newline is seen
std::string name;
std::getline(std::cin, name); // reads a full line

在您的情况下,如果您还没有完成任何以空格分隔的输入,cin.ignore将跳过第一次尝试提供您的线路输入。你应该立即使用std :: getline。该行末尾的换行符是 not 附加到字符串,但它将从输入流中删除。

documentation for std::getline在&#34; Notes&#34;中解释了这一点。部分。

对于更健壮的行输入函数,您无法确定上一个输入操作是否在流上留下换行符(或者您正在使用的任何分隔符),您可以执行以下操作:

char ch;
std::cin.peek(ch);
if (ch == '\n') {
    std::cin.ignore(1, '\n'); // or std::cin.get(ch);
}
std::string line;
std::getline(std::cin, line);

peek成员函数将返回要读取的下一个字符,而不从流中删除它。如果它是换行符,您可以继续忽略它。否则,getline调用将读取整行,包括您刚刚查看的字符。

或者,如果您只想使用空格,则可以使用std::ws操纵器。

答案 1 :(得分:0)

在这种情况下,您无需使用ignore()getline()不会将新行字符放入字符串。

它要求您输入两次的原因是因为ignore()函数正在移除,直到您的第一个 200 输入字符或直到换行符(您的分隔符),所以下一个{{ 1}}可能没有任何东西可以阅读,因此要求你输入(除非你的第一个输入包含超过200个字符,在这种情况下它将读取缓冲区中的剩余字符。)

std::getline()不会将分隔符字符添加到已读取的字符串中,默认情况下为换行符