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

如何阻止CString的FormatMessageV将\n替换为\r\n?

解决CString::FormatMessageV自动将\n转换为\r\n的问题

问题原因

CString::FormatMessageV本质是封装了Windows系统API的FormatMessage函数,而该API的默认行为会将消息中的\n(LF)自动替换为\r\n(CRLF),以此适配Windows平台的文本换行规范,这就是导致问题的根本原因。

解决方案

方案1:格式化后手动移除多余的\r

直接在格式化完成后,将结果中的所有回车符(\r)替换为空字符串:

int main() 
{
    CString text = L"\nint Fun(LPCTSTR commandLine, UINT number)\n{ Perform(commandLine,%1); \n }";
    CString formattedText = FormatV(text, 1);
    formattedText.Replace(L"\r", L""); // 移除所有回车符
    if (formattedText.Find(L'\r', 0) != -1)
        std::cout << "Has CR in it!";
    else
        std::cout << "No CR, good!";
}

方案2:改用CString::FormatV替代FormatMessageV

CString类提供了另一个可变参数格式化函数FormatV,它是类自身实现的逻辑,不会调用系统的FormatMessage,因此不会自动转换换行符。注意FormatV的参数是直接传入va_list,而非va_list*:

#include <atlstr.h>
#include <iostream>
 
CString FormatV(LPCTSTR first, ...)
{
    va_list vaList = nullptr;
    CString buffer;
    va_start(vaList, first);
    buffer.FormatV(first, vaList); // 使用CString原生FormatV
    va_end(vaList);
    return buffer;
}
 
int main() 
{
    CString text = L"\nint Fun(LPCTSTR commandLine, UINT number)\n{ Perform(commandLine,%1); \n }";
    CString formattedText = FormatV(text, 1);
    if (formattedText.Find(L'\r', 0) != -1)
        std::cout << "Has CR in it!";
    else
        std::cout << "No CR, good!";
}

内容的提问来源于stack exchange,提问作者ZoomIn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:03:36