如何从键盘输入的字符串中提取最后一个整数并存储?解决结果异常问题
问题解决:从键盘输入字符串提取最后一个整数异常
需求与问题
需求:从键盘输入固定格式的字符串(例如"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; }
问题根源
- 输入读取不完整:如果直接用
cin >> Serial读取键盘输入,会在遇到空格时停止,只能获取第一个空格前的内容,导致后续处理没有有效数字,last变量未被赋值(局部变量未初始化,值为随机垃圾值,用户看到的0是巧合)。 - 变量未初始化:
last作为局部变量未初始化,若没有提取到任何整数,其值是未定义的,可能表现为0或其他随机值。 - 过滤逻辑冗余:原代码用
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
相关产品推荐
相关产品推荐

