2016-05-17 139 views
0

我的字符串的樣子:格式字符串問題不正確的格式說明

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) 

的值可以是字符串或整數。 請建議。

回答

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數據類型。

+0

我需要使用%和額外%的轉義字符串根據需要爲%s和%d工作。非常感謝。 –

5

如果您需要使用%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