我来自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 ++的正确语法吗?
答案 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*
指针。简而言之,您可以直接使用inputFilename
和outputFilename
。
除了那个小问题,真正的问题是+=
将不起作用(它将尝试做指针算术,如果有的话,这根本不是你想要的)。相反,请使用_tcscat()
:
_tcscat(inputFilename, TEXT("somefile.txt"));
// ...
像往常一样,要注意以这种方式处理低级字符数组所带来的缓冲区溢出漏洞......
还有一件事:你永远不会初始化inputFilename
和outputFilename
- 它们需要在连接到它们之前初始化为某些字符串。