You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从键盘输入的字符串中提取最后一个整数并存储?解决结果异常问题

问题解决:从键盘输入字符串提取最后一个整数异常

需求与问题

需求:从键盘输入固定格式的字符串(例如"A 2 D F 5 A",共6个字符),提取其中最后一个整数(如示例中的5)存入变量。
问题:原代码使用固定字符串测试时正常运行,但改为键盘输入后,提取到的最后一个整数总是0,而非预期值。

原代码

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

struct not_digit {
    bool operator()(const char c) {
        return c != ' ' && !std::isdigit(c);
    }
};

int main() {

    int last;

    std::string Serial(" 1 S 4 W 2 A");
    not_digit not_a_digit;
    std::string::iterator end = std::remove_if(Serial.begin(), Serial.end(), not_a_digit);
    std::string all_numbers(Serial.begin(), end);
    std::stringstream ss(all_numbers);
    std::vector<int> numbers;

    for(int i = 0; ss >> i; ) {
        numbers.push_back(i);
        last = i;
    }

    cout << last << endl;

    return 0;
}

问题根源

  1. 输入读取不完整:如果直接用cin >> Serial读取键盘输入,会在遇到空格时停止,只能获取第一个空格前的内容,导致后续处理没有有效数字,last变量未被赋值(局部变量未初始化,值为随机垃圾值,用户看到的0是巧合)。
  2. 变量未初始化:last作为局部变量未初始化,若没有提取到任何整数,其值是未定义的,可能表现为0或其他随机值。
  3. 过滤逻辑冗余:原代码用remove_if过滤非数字非空格字符,其实可以直接通过字符串流尝试转换,逻辑更简洁可靠。

修复后的代码

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
    // 初始化last为标记值,区分未找到整数的情况
    int last = -1;
    string input;

    // 读取整行输入,包含所有空格
    getline(cin, input);

    stringstream ss(input);
    string token;
    int num;

    // 逐个读取输入中的元素,尝试转换为整数
    while (ss >> token) {
        if (stringstream(token) >> num) {
            last = num;
        }
    }

    // 输出结果
    if (last != -1) {
        cout << last << endl;
    } else {
        cout << "输入中未找到整数" << endl;
    }

    return 0;
}

修复说明

  • 使用getline(cin, input)读取完整的一行输入,确保包含所有空格,解决了输入截断的问题。
  • 初始化last为-1,能明确区分"未找到整数"和"最后一个整数是0"的场景,避免未定义行为。
  • 直接遍历输入的每个元素,尝试转换为整数,无需提前过滤字符,逻辑更直观且健壮,支持多位数整数的提取。

内容的提问来源于stack exchange,提问作者Shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:35:17