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

C++中如何处理<、>、"特殊字符并提取字符串数值信息?

问题分析与解决思路

你的程序出现异常的核心原因有两个:

  1. cin >> line6的读取限制:这个操作会以空格、制表符或换行符作为分隔符,只能读取到第一个空格前的内容,而你测试的XML格式字符串包含空格,导致读取不完整。更关键的是,终端会把<、>解析成输入输出重定向符号,比如输入<时,终端会等待你指定一个文件作为输入,程序因此陷入异常状态,看似崩溃。
  2. 双引号的终端解析:手动输入双引号时,终端会将其视为命令行的引号起始标记,等待你输入闭合的引号,程序会一直处于等待输入的状态,表现为异常。

解决步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:34:54