首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用std::cin会导致std::vector::push_back在msvc上失败,但在clang上不会失败

问题分析

在使用 std::cin 读取输入并尝试将数据推入 std::vector 时,如果在 MSVC(Microsoft Visual C++)上失败,而在 Clang 上成功,可能是由于以下几个原因:

  1. 输入缓冲区问题:MSVC 可能对输入缓冲区的处理与 Clang 不同,导致在某些情况下无法正确读取输入。
  2. 同步问题:C++ 标准库中的 std::cin 和 C 标准库中的 stdio 函数(如 scanf)可能存在同步问题,MSVC 可能更容易受到这种问题的影响。
  3. 编译器优化:不同的编译器可能会有不同的优化策略,这可能会影响输入和输出的处理。

解决方案

以下是一些可能的解决方案:

1. 清除输入缓冲区

在读取输入之前,清除输入缓冲区可以避免一些潜在的问题。

代码语言:txt
复制
#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;
}

2. 使用 std::getlinestd::stoi

另一种方法是使用 std::getline 读取整行输入,然后使用 std::stoi 将字符串转换为整数。

代码语言:txt
复制
#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 失败的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券