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

时间:2016-05-17 08:08:21

标签: c++11 mfc

My String看起来像:

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)

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

2 个答案:

答案 0 :(得分:5)

如果您需要使用%1和%2,请考虑使用FormatMessage CString 成员。并且,如上所述,如果你想要一个%字符,请使用%%。

但是使用 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 :(得分:3)

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的数据类型。