C++中如何处理<、>、"特殊字符并提取字符串数值信息?
问题分析与解决思路
你的程序出现异常的核心原因有两个:
cin >> line6的读取限制:这个操作会以空格、制表符或换行符作为分隔符,只能读取到第一个空格前的内容,而你测试的XML格式字符串包含空格,导致读取不完整。更关键的是,终端会把<、>解析成输入输出重定向符号,比如输入<时,终端会等待你指定一个文件作为输入,程序因此陷入异常状态,看似崩溃。- 双引号的终端解析:手动输入双引号时,终端会将其视为命令行的引号起始标记,等待你输入闭合的引号,程序会一直处于等待输入的状态,表现为异常。
解决步骤
1. 改用整行读取
把cin >> line6替换为getline(cin, line6),这样可以读取包含空格的整行内容,避免分隔符截断问题。
2. 正确输入特殊字符
在终端输入包含<、>、"的字符串时,用单引号把整个字符串包裹起来(比如bash终端),这样终端会把包裹的内容当作普通文本,不会解析特殊符号。例如输入:
'<bounds minlat="51.4374338" minlon="-0.2090608" maxlat="51.5663602" maxlon="-0.0019455"/>'
3. 适配文件读取场景
你的最终需求是从文件读取字符串,这时候完全不会遇到终端解析特殊符号的问题,直接用getline读取文件的每一行即可,不需要额外处理终端输入的特殊情况。
修改后的测试代码
#include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ // <bounds minlat="51.4374338" minlon="-0.2090608" maxlat="51.5663602" maxlon="-0.0019455"/> string line6; cout << "string: "; // 改用getline读取整行 getline(cin, line6); std::replace( line6.begin(), line6.end(), '<', ':'); std::replace( line6.begin(), line6.end(), '>', ';'); std::replace( line6.begin(), line6.end(), '"', '_'); cout << "\n" << line6; return 0; }
额外建议
如果你的目标是解析XML格式的字符串,直接手动替换字符效率低且容易出错,建议使用成熟的XML解析库(比如TinyXML2、pugixml),可以直接提取minlat、minlon等属性值,不需要手动处理字符串替换。
内容的提问来源于stack exchange,提问作者Cool_cricri
相关产品推荐
相关产品推荐

