格式字符串问题不正确的格式说明

问题描述:

我的字符串的样子:格式字符串问题不正确的格式说明

std::wstring replacePattern = L";FOLD PTP %1 Vel=100 % PDAT%2"; 

我期待把值就可以了:

CString replaceString;  
replaceString.Format(replacePattern.c_str(), posData.m_posName, posData.m_posName) 

运行时间:错误:

Expression: ("Incorrect format specifier", 0) 

的值可以是字符串或整数。 请建议。

MFC/ATL的CStringT::Format不支持位置格式说明符,所以%1,%2等不是合法的类型字段。您必须使用%d(整数)或%s作为字符串。如果在格式字符串中需要百分号,则需要使用%%(请参阅printf Type Field Characters)将其转义。

你的模式应该像

std::wstring replacePattern = L";FOLD PTP %d Vel=100 %% PDAT%d"; 

std::wstring replacePattern = L";FOLD PTP %s Vel=100 %% PDAT%s"; 

取决于posData.m_posName数据类型。

+0

我需要使用%和额外%的转义字符串根据需要为%s和%d工作。非常感谢。 –

如果您需要使用%1和%2,请考虑使用FormatMessageCString成员来代替。而且,如前所述,如果您想要%字符,请使用%%。

但是使用FormatMessage你可以做你想做的事。如果你想要的东西就像你用一个整数

std::wstring replacePattern = L";FOLD PTP %1% Vel=100 %% PDAT%2!d!"; 

CString replaceString;  
replaceString.FormatMessage(replacePattern.c_str(), posData.m_posName, posData.m_posName) 

%1!d! 

只要改变数字来表示您正在使用的变量

所以这会是这样的。

如果你想要的东西就像一个CString使用:

%1% 

帮助主题上面提供更多细节。所以,虽然你可以修改你的格式字符串,这样CString :: Format就可以工作,但它会限制你的值的顺序。但是,如果由于本地化您需要具有不同顺序的值的能力,请考虑使用CString :: FormatMessage来代替。

+1

您链接到MFC CString类的Visual Studio 6版本。当前的ATL/MFC文档可以在[CStringT :: FormatMessage](https://msdn.microsoft.com/en-us/library/041zd9kb.aspx)上找到。 – IInspectable

+0

@IInspectable谢谢。我试图找到一个新的网页。我应该修改我的答案以使用更新的链接? –

+0

我建议你链接到当前的文档。您的答案中的链接实际上只是指Visual Studio 6附带的MFC CString实现(可能不再适用)。另外,该页面上其他信息的所有链接现在都已经死亡。 – IInspectable