如何阻止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
相关产品推荐
相关产品推荐

