C++实现两种输入格式一致解析:将点号视为空格处理
解决C++中解析1.2.3和1 2 3得到相同结果的问题
嘿,这个需求其实挺典型的——本质就是要把输入里的.和 都当成分隔符,提取出三个整数对吧?我给你分享几种实用的实现思路,你可以根据自己的场景挑合适的:
方法一:预处理字符串,统一分隔符
这个方法最简单直观,核心思路是把输入里所有的.替换成空格,然后用C++的字符串流来读取整数(因为字符串流默认会以空白字符分隔数据)。
#include <iostream> #include <string> #include <algorithm> #include <sstream> using namespace std; int main() { string input; // 先读取整行输入,避免cin遇到空格就停止的问题 getline(cin, input); // 把所有的点替换成空格 replace(input.begin(), input.end(), '.', ' '); // 用字符串流解析处理后的内容 istringstream iss(input); int a, b, c; if (iss >> a >> b >> c) { cout << "a: " << a << ", b: " << b << ", c: " << c << endl; } else { cout << "输入格式不对哦,请检查!" << endl; } return 0; }
为啥推荐这个?因为它依赖C++标准库的工具,不用自己写复杂的解析逻辑,而且还能处理混合分隔符的情况——比如输入1.2 3或者1 2.3也能正确解析,容错性挺强的。
方法二:逐个跳过非数字分隔符
如果你不想预处理整个字符串,也可以边读边处理:先读一个整数,然后跳过所有不是数字的字符(这里就是.和 ),再读下一个整数,以此类推。
#include <iostream> #include <cctype> using namespace std; int main() { int a, b, c; char dummy; // 用来存分隔符,不用实际使用它 // 读第一个整数 cin >> a; // 跳过所有非数字的字符 while (cin.peek() != EOF && !isdigit(static_cast<unsigned char>(cin.peek()))) { cin >> dummy; } // 读第二个整数 cin >> b; // 再跳过非数字字符 while (cin.peek() != EOF && !isdigit(static_cast<unsigned char>(cin.peek()))) { cin >> dummy; } // 读第三个整数 cin >> c; cout << "a: " << a << ", b: " << b << ", c: " << c << endl; return 0; }
这个方法的好处是更灵活——以后如果要支持更多分隔符(比如逗号,),只需要在判断里加条件就行。不过要注意,如果输入格式不合法(比如只有两个数),可能会出现读取失败的情况,你可以额外加判断来处理这种场景。
方法三:用正则表达式严格匹配格式
如果你需要严格验证输入格式(比如必须是三个整数,中间只能是点或空格),那正则表达式就很合适了(需要C++11及以上版本支持)。
#include <iostream> #include <string> #include <regex> using namespace std; int main() { string input; getline(cin, input); // 正则表达式:匹配三个整数,中间可以是一个或多个空格/点 regex pattern(R"((\d+)[\s.]+(\d+)[\s.]+(\d+))"); smatch match_results; if (regex_search(input, match_results, pattern)) { // 把捕获到的字符串转换成整数 int a = stoi(match_results[1]); int b = stoi(match_results[2]); int c = stoi(match_results[3]); cout << "a: " << a << ", b: " << b << ", c: " << c << endl; } else { cout << "输入格式不符合要求,请输入类似1.2.3或1 2 3的内容!" << endl; } return 0; }
这里的正则表达式[\s.]+表示“一个或多个空格或者点”,(\d+)用来捕获每个整数。这种方法能精准过滤掉不符合格式的输入,比如1-2-3就会被判定为无效,适合对格式要求高的场景。
内容的提问来源于stack exchange,提问作者zoey xeen
相关产品推荐
相关产品推荐

