所以,我想使用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¤cy=USD¬ify_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()的一些内容,但我认为这不是我需要的东西,或者也许,我很想念那个清楚的东西。
谢谢!
答案 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()
不会将分隔符字符添加到已读取的字符串中,默认情况下为换行符。