我是C ++的新手。我的程序崩溃,我试图找出原因。在代码的某个时刻,我生成一个随机数,然后我复制一个文件,其原始文件名后跟数字
char CopyPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_MYMUSIC, NULL, 0, CopyPath);
int randomNumber = 101 + rand()%1000000000;
char randomBuffer[15];
itoa(randomNumber, randomBuffer, 10);
char computerName[MAX_COMPUTERNAME_LENGTH+1];
DWORD size = MAX_COMPUTERNAME_LENGTH;
if(!GetComputerName(computerName, &size))
strcat(computerName, "FAIL");
strcat(CopyPath,"\\");
strcat(CopyPath, computerName);
strcat(CopyPath, "-");
strcat(CopyPath, randomBuffer);
copyFile(oldpath, CopyPath);
我怀疑崩溃发生在这里的某个地方。我的问题是,因为我没有声明CopyPath的所有值,所以发生了崩溃。我应该将其声明为
char CopyPath[MAX_PATH] = {'\0'}
这可能是问题吗?
答案 0 :(得分:2)
if(!GetComputerName(computerName, &size)) strcat(computerName, "FAIL");
这应该是strcpy
,因为computerName
中没有有效的字符串可以追加。
此外,您可能应该调用SHGetFolderPathA
,因为您传递的是char
(而不是TCHAR
)的缓冲区。
答案 1 :(得分:0)
首选使用std :: string而不是C数组来保存字符串信息,因为它通过=和+运算符提供正确的复制和连接。
答案 2 :(得分:0)
不确定是什么导致您的情况崩溃。我猜它一定是缓冲区溢出问题。你是否考虑MAX_PATH中结束\0
字符的空格?
答案 3 :(得分:0)
我相信您已从其他评论中了解到您的代码不是很好(至少由于样式和可能的缓冲区溢出)。
仅考虑您的具体问题 - 您是对的 - 问题在于未初始化的char数组,它不代表C字符串,因为它必须是零终止的。您可能知道strcat
适用于C字符串。所以改变:
char CopyPath[MAX_PATH]; // this is not a C-string
到
char CopyPath[MAX_PATH] = {0}; // this is a C-string (empty though)
将解决这个特殊问题。
编辑:这种方法应该与您将用strcat
作为连接目标的任何缓冲区一起使用,在您的情况下为computerName