Формат MFC CString дает странное поведение - PullRequest
2 голосов
/ 16 февраля 2011

У меня странная проблема с CString У меня есть следующий код, который дает неожиданный результат:

CString sourcePath = _T("C:\\some\\path\\file.ext");
CString log;
log.Format(_T("Path = %s"), sourcePath);

строка результата показывает Path = (null).

Я не уверен, что там происходит под капотом, я попытался привести sourcePath к LPCTSTR и получил действительный указатель и при просмотре содержимого этого адреса памяти в окне просмотра памяти MSVC все кажется действительным.

это раздражает меня, так как я пробовал тот же метод в предыдущих проектах, и он работал довольно хорошо.

Спасибо.

P.S. Пожалуйста, прежде чем люди начнут здесь комментировать вопрос о том, что такое CString, как это произошло в моем предыдущем посте, сначала проверьте здесь: MSDN CString

Редактировать: извините за косую черту ... и да, оригинальный код имеет двойную косую черту ..

Ответы [ 4 ]

0 голосов
/ 17 февраля 2011

В зависимости от версии MFC и от того, создано ли ваше приложение для win32 или x64, вам может потребоваться привести CString:

log.Format(_T("Path = %s"), (LPCTSTR)sourcePath);
0 голосов
/ 16 февраля 2011

Как указывается в вашей ссылке на MSDN CString, вы не можете передать саму CString в функцию Format.

Использование:

  log.Format(_T("Path = %s"), sourcePath.GetString());
0 голосов
/ 16 февраля 2011

Строка "C: \ some \ path \ file.ext" должна быть "C: \ some \ path \ file.ext" - в противном случае вместо этого вы будете читать управляющие символы (\ s \ p \ f).

0 голосов
/ 16 февраля 2011

Проблема в инициализации вашего sourcePath. Символ \ является специальным символом в C / C ++. Вы должны заменить его на \ (двойной) Поэтому первая строка кода должна быть: CString sourcePath = _T ("C: \\ some \\ path \\ file.ext");

Надеюсь, это поможет.

...