Member 12330615 Ответов: 2

Как я могу исправить свою неявную ошибку?..


Использование Visual Studio 2015 с VC++

буфер char [100];

CString strTmp = _T("");

strTmp. Format (_T ("%s"), buffer); не выдает никаких сообщений об ошибках.

Но после анализа кода он делает предупреждение "invald parameters transit position.... и т. д"

Есть ли какой-то опасный пункт в приведенном выше коде?

Что я уже пробовал:

Почти в каждой из моих программ с перемещением значения из буфера char в переменную CString,
Я не знаю, что такое ошибка.

2 Ответов

Рейтинг:
20

KarstenK

Это старая проблема ANSI и UNICODE.

Чтобы избежать этого, я использую TCHAR, который заставляет препроцессор использовать правильный тип char.

TCHAR buffer[100];

CString strTmp = _T("");

strTmp.Format(_T("%s"), buffer); 


Я предполагаю, что ваш компилятор обнаружит после этого изменения некоторые ошибки в доступе к буферу. И это правильно: измените и это тоже!!!


Рейтинг:
1

Jochen Arndt

В дополнение к решению 1:

Если вам нужно отформатировать строку с помощью char* строковый аргумент, вы можете указать это в формате с помощью h префикс:

char buffer[100] = "A char* string";
CString strTmp;
strTmp.Format(_T("%hs"), buffer)

Это будет конвертировать char* string в широкую строку во время выполнения и вставьте ее в Unicode-сборки. При сборках без Юникода префикс игнорируется.


KarstenK

Хорошо, но это затрудняет понимание кода, потому что приводит к смешиванию строкового типа. И приводит только к ошибкам.

Jochen Arndt

Спасибо.

Мое намерение не состояло в том, чтобы предложить сделать это таким образом при использовании локального экземпляра буфера.

Это относится к случаям, когда существующая строка char* должна быть отформатирована (например, передана в качестве параметра функции, получена из вызова библиотечной функции или прочитана из файла ANSI/ASCII, устройства или сокета).