字符串指针语法,这是正确的吗?

时间:2012-02-01 21:36:28

标签: c++ visual-c++ pointers syntax visual-c++-2008

我来自C#背景,我的C ++非常生疏所以请耐心等待。

以下函数定义接受指向输入文件名(szIn)和输出文件名(szOut)的字符串的指针(LPTSTR)。这是函数原型:

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在Visual Studio 2008中使用C ++的正确语法吗?

4 个答案:

答案 0 :(得分:4)

不。 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 char数组不能像这样连接。您必须使用_tcscat或其他类似功能。

答案 1 :(得分:1)

这是非法的:

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);

不需要创建另一个指向这些变量的指针(因为数组会衰减为指针)。

编辑:

更改语言后,您可以使用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);

答案 2 :(得分:0)

不,你不能连接这样的字符串。您正试图将const char[]附加到另一个数组的末尾...它甚至无法编译。您需要使用_tcscat()或(更好的是,因为您已添加了C ++标记),std::basic_string<TCHAR>

答案 3 :(得分:0)

不完全。 TCHAR数组应该已经衰减为TCHAR指针,这就是LPTSTR(a TCHAR*)。因此,除非声明函数接受LPCSTR,否则不应使用char*指针。简而言之,您可以直接使用inputFilenameoutputFilename

除了那个小问题,真正的问题是+=将不起作用(它将尝试做指针算术,如果有的话,这根本不是你想要的)。相反,请使用_tcscat()

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

像往常一样,要注意以这种方式处理低级字符数组所带来的缓冲区溢出漏洞......

还有一件事:你永远不会初始化inputFilenameoutputFilename - 它们需要在连接到它们之前初始化为某些字符串。