我试图从cin
中获取字符串作为输入,然后每次将字符串推入向量中。但是,即使在所有输入的末尾加上“ \”,我的循环也不会终止。
int main(void) {
string row;
vector<string> log;
while (cin >> row) {
if (row == "\n") {
break;
}
log.push_back(row);
}
return 0;
}
我尝试用(cin >> row
)替换(getline(cin,row)
),但没有任何区别。我已经尝试过使用stringstream,但是我真的不知道它是如何工作的。我该如何解决这个问题?
答案 0 :(得分:9)
如@SidS所评论,空格被丢弃。因此,您必须考虑另一种策略。
您可以改为检查https://maps.googleapis.com/maps/api/geocode/json?address=ADDRESS&key=KEY
是否为空。但这仅适用于row
:
std::getline
OP,如果要保存单个单词(而不是整行),可以在输入后使用regex
单手将每个单词推入#include <vector>
#include <string>
#include <iostream>
int main() {
std::string row;
std::vector<std::string> log;
while (std::getline(std::cin, row)) {
if (row.empty()) {
break;
}
log.push_back(row);
}
std::cout << "done\n";
}
中。
log
示例运行:
#include <vector>
#include <string>
#include <iostream>
#include <regex>
int main() {
const std::regex words_reg{ "[^\\s]+" };
std::string row;
std::vector<std::string> log;
while (std::getline(std::cin, row)) {
if (row.empty()) {
break;
}
for (auto it = std::sregex_iterator(row.begin(), row.end(), words_reg); it != std::sregex_iterator(); ++it){
log.push_back((*it)[0]);
}
}
for (unsigned i = 0u; i < log.size(); ++i) {
std::cout << "log[" << i << "] = " << log[i] << '\n';
}
}
答案 1 :(得分:2)
如果您要存储std::cin
中 one 行的令牌,请按照标准机制进行分隔,例如operator>>
中的<iostream>
重载(即,按空格/换行符分隔),您可以这样做:
std::string line;
std::getline(std::cin, line);
std::stringstream ss{line};
const std::vector<std::string> tokens{std::istream_iterator<std::string>{ss},
std::istream_iterator<std::string>{}};
请注意,这不是最有效的解决方案,但它应能按预期工作:仅处理一行并使用现有机制将该行拆分为单独的std::string
对象。
答案 2 :(得分:1)
您不能使用字符串hello you
a b c d e f g
18939823
@_@_@ /////
log[0] = hello
log[1] = you
log[2] = a
log[3] = b
log[4] = c
log[5] = d
log[6] = e
log[7] = f
log[8] = g
log[9] = 18939823
log[10] = @_@_@
log[11] = /////
来读取换行符。该运算符将忽略空格,并且将永远不会返回字符串istream& operator >>
。考虑改用getline。