Синтаксис указателя строки, это правильно? - PullRequest
0 голосов
/ 02 февраля 2012

Я родом из C # и мой C ++ очень ржавый, поэтому, пожалуйста, потерпите меня.

Следующее определение функции принимает указатели (LPTSTR) на строки, представляющие имя входного файла (szIn) и имя выходного файла (szOut).Вот прототип функции:

ConvertFile(LPTSTR szIn, LPTSTR szOut);

В настоящее время функция выполняется из некоторого кода UI, вот пример того, как выходное имя файла получается из указателя szOutput:

TCHAR szOutput[255];    // output filename

if (g_szFilename[0] != 0)
{
    SetDlgItemText(hMainDlg, IDC_EDIT_INPUT, g_szFilename);
    _tcscpy(szOutput, g_szFilename);
    TCHAR * szExt = _tcsrchr(szOutput, '.');
    if (szExt != NULL) *szExt = 0;
    _tcscat(szOutput, _T(".png"));
}

Я хочу сделать что-то вроде этого:

TCHAR inputFilename[256];
TCHAR outputFilename[256];

inputFilename += "somefile.txt";
outputFilename += "someotherfile.txt";

char *inputPtr;
char *outputPtr;

inputPtr = inputFilename;
outputPtr = outputFilename;

ConvertFile(inputPtr, outputPtr);

Это правильный синтаксис для разновидности Microsoft C ++ в Visual Studio 2008?

Ответы [ 4 ]

4 голосов
/ 02 февраля 2012

Неа.Строки C ++ могут делать то, что вы пытаетесь сделать:

// Since we don't know whether to use string or wstring, we're stuck
// with basic_string<TCHAR>
std::basic_string<TCHAR> inputFilename, outputFilename;

// Note the TEXT macro...it makes sure your chars are TCHARs
inputFilename += TEXT("somefile.txt");
outputFilename += TEXT("someotherfile.txt");

// basic_string::c_str() returns you a pointer suitable for C stuff
// (since this is a string of TCHARs, we'll get a const TCHAR* back)
ConvertFile(inputFilename.c_str(), outputFilename.c_str());

Массивы символов C не могут быть объединены таким образом.Вам придется использовать _tcscat или другие подобные функции.

1 голос
/ 02 февраля 2012

Это недопустимо:

inputFilename += "somefile.txt";
outputFilename += "someotherfile.txt";

Вы можете использовать _tcscpy() для копирования строк:

TCHAR inputFilename[256]  = { 0 }; /* FYI, the '= { 0 }' initialises the array.*/
TCHAR outputFilename[256] = { 0 };

_tcscpy(inputFilename, "somefile.txt");

и использовать _tcscat() для объединения:

_tcscat(inputFilename, "another-bit.txt");

Затем можно перейти к ConvertFile():

ConvertFile(inputFilename, outputFilename);

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

EDIT:

После смены языка вы можете использовать std::basic_string:

std::basic_string<TCHAR> inputFilename(TEXT("somefile.txt"));
std::basic_string<TCHAR> outputFilename(TEXT("someotherfile.txt"));

И вы можете выполнить конкатенацию, как вы изначально хотели:

inputFilename += TEXT("a-bit-more");

И использовать c_str() метод доступа к внутреннему массиву символов для передачи ConvertFile():

ConvertFile(inputFilename.c_str(), outputFilename.c_str());

Обратите внимание, что c_str() возвращает const, измените ConvertFile() на ( Я сделал предположение, что ConvertFile() не изменяет буферы, переданные в ):

ConvertFile(LPCTSTR szIn, LPCTSTR, szOut);
0 голосов
/ 02 февраля 2012

Не совсем.Массивы TCHAR уже должны распадаться на указатели TCHAR, что и является LPTSTR (a TCHAR*).Таким образом, вы не должны использовать указатели char*, если только функция не объявлена ​​для принятия LPCSTR.Короче говоря, вы можете использовать inputFilename и outputFilename напрямую.

Помимо этого незначительного вопроса, реальная проблема заключается в том, что += не будет работать (он попытается выполнить арифметику указателей, есливсе, что совсем не то, что вы хотите).Вместо этого используйте _tcscat():

_tcscat(inputFilename, TEXT("somefile.txt"));
// ...

Как обычно, остерегайтесь уязвимостей переполнения буфера, которые возникают при работе с низкоуровневыми символьными массивами таким образом ...

Еще одна вещь: выникогда не инициализируйте inputFilename и outputFilename - они должны быть инициализированы какой-либо строкой, прежде чем вы сможете объединить их.

0 голосов
/ 02 февраля 2012

Нет, вы не можете объединить такую ​​строку. Вы пытаетесь добавить const char[] в конец другого массива ... который даже не скомпилируется. Вам необходимо использовать _tcscat () или (еще лучше, если вы добавили тег C ++) std::basic_string<TCHAR>.

...