C++中字符形式负数转换结果异常,求技术排查与解决
问题原因分析
你现在的错误核心是把带空格分隔的数字串直接去掉所有空格后,破坏了负数的结构,而且单个字符转换的逻辑只适用于单个数字字符,不适用于负号和多位数的情况:
- 原字符串去掉空格后,
result的值是"83-542-100-9474-4",result[2]是字符'-',而非你预期的-5这个数字的一部分。 - 字符
'-'的ASCII码是45,字符'0'的ASCII码是48,45-48=-3,这就是你得到-3的直接原因。
正确解决方案
不需要手动去除空格,直接按空格分割每个数字串再转换为int即可,这里提供两种简单的实现方式:
方法1:利用stringstream自动处理(推荐)
stringstream可以自动忽略空格,直接读取每个整数,包括负数和多位数:
#include <iostream> #include <sstream> #include <vector> using namespace std; int main() { string str = "8 3 -5 42 -1 0 0 -9 4 7 4 -4"; stringstream ss(str); vector<int> lst; int num; // 从流中逐个读取整数,自动处理空格、正负号和多位数 while (ss >> num) { lst.push_back(num); } // 输出测试 cout << "转换后的vector内容:"; for (int n : lst) { cout << n << " "; } return 0; }
方法2:手动分割字符串转换
如果需要手动处理分割逻辑,可以按空格拆分原字符串,将每个子串(如"-5"、"42")转换为int:
#include <iostream> #include <vector> #include <string> using namespace std; int main() { string str = "8 3 -5 42 -1 0 0 -9 4 7 4 -4"; vector<int> lst; size_t start = 0; size_t end = str.find(' '); while (end != string::npos) { // 截取空格分隔的子串,转换为int string num_str = str.substr(start, end - start); lst.push_back(stoi(num_str)); start = end + 1; end = str.find(' ', start); } // 处理最后一个数字 lst.push_back(stoi(str.substr(start))); // 输出测试 cout << "转换后的vector内容:"; for (int n : lst) { cout << n << " "; } return 0; }
两种方法都能正确处理负数、多位数,最终得到的vector会包含8, 3, -5, 42, -1, 0, 0, -9, 4, 7, 4, -4这些正确的整数。
内容的提问来源于stack exchange,提问作者user15442068
相关产品推荐
相关产品推荐

