在使用 std::cin
读取输入并尝试将数据推入 std::vector
时,如果在 MSVC(Microsoft Visual C++)上失败,而在 Clang 上成功,可能是由于以下几个原因:
std::cin
和 C 标准库中的 stdio
函数(如 scanf
)可能存在同步问题,MSVC 可能更容易受到这种问题的影响。以下是一些可能的解决方案:
在读取输入之前,清除输入缓冲区可以避免一些潜在的问题。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
int num;
// 清除输入缓冲区
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Enter numbers (enter a non-integer to stop): ";
while (std::cin >> num) {
vec.push_back(num);
}
std::cout << "Vector contents: ";
for (const auto& val : vec) {
std::cout << val << " ";
}
std::cout << std::endl;
return 0;
}
std::getline
和 std::stoi
另一种方法是使用 std::getline
读取整行输入,然后使用 std::stoi
将字符串转换为整数。
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<int> vec;
std::string line;
std::cout << "Enter numbers separated by spaces (enter a non-integer to stop): ";
while (std::getline(std::cin, line)) {
try {
size_t pos = 0;
while ((pos = line.find(' ')) != std::string::npos) {
vec.push_back(std::stoi(line.substr(0, pos)));
line.erase(0, pos + 1);
}
if (!line.empty()) {
vec.push_back(std::stoi(line));
}
} catch (const std::invalid_argument& e) {
break;
} catch (const std::out_of_range& e) {
std::cerr << "Number out of range!" << std::endl;
}
}
std::cout << "Vector contents: ";
for (const auto& val : vec) {
std::cout << val << " ";
}
std::cout << std::endl;
return 0;
}
通过以上方法,可以有效解决在 MSVC 上使用 std::cin
导致 std::vector::push_back
失败的问题。
领取专属 10元无门槛券
手把手带您无忧上云