几年前我会认为这是微不足道的......自从我涉足C或C ++并且我遇到一个现在导致偏头痛的问题以来已经有一段时间了。
我收到以下代码的错误:
CompressFile::CompressFile(wchar_t *WorkingDirectory, wchar_t *File)
{
int bzipError = BZ_OK;
wprintf(L"Attempting to compress %s%s\n", WorkingDirectory, File);
wchar_t FileRawInput[MAX_PATH];
wcsncpy(FileRawInput, WorkingDirectory, sizeof(FileRawInput));
wcsncat(FileRawInput, File, sizeof(FileRawInput));
wchar_t bzipCompressedOutput[MAX_PATH];
wcsncpy(bzipCompressedOutput, FileRawInput, sizeof(bzipCompressedOutput));
wcscat(bzipCompressedOutput, L".bz2");
wprintf(L"Output of string bzip: %s\n", bzipCompressedOutput);
wprintf(L"Output of string raw: %s\n", FileRawInput);
}
我在第8行收到以下错误:
Unhandled exception at 0x64F4C6D1 in ias-agent.exe: 0xC00001A5: An invalid exception handler routine has been detected (parameters: 0x00000003).
我已经走了很远,以避免使用string
课程,我想暂时保持这种状态。我要做的就是为RawFileInput
添加两个字符串,然后将RawFileInput
的值添加到bzipCompressionOutput
,最后将.bz2
连接到{{1}的末尾1}}。
答案 0 :(得分:2)
在last page of chapter 4 in his book中:“C ++编程语言”Bjarne Stroustrup the creator of C++说:
首选
strings
超过C风格的字符串
这是唯一的建议,但我鼓励你遵循它。
但你真正的问题是,你sizeof(FileRawInput)
中的不 wchar_t
FileRawInput
同样没有{{1}在sizeof(bzipCompressedOutput)
数组中,两者都有bzipCompressedOutput
MAX_PATH
个。问题是wchar_t
将告诉您数组中的字节数,但如果每个元素大于1个字节,那么您错误地告诉sizeof
和wcsncpy
您的字符数。 wscncat
通常为2个字节:https://msdn.microsoft.com/en-us/library/s3f49ktz.aspx表示您正在有效呼叫wchar_t
。踩踏内存100 wcsncpy(FileRawInput, WorkingDirectory, 200)
超出你的分配范围。更正此问题将删除您的段错误。
但是为了打印宽字符串,您需要正确使用wchar_t
修饰符%ls
。
最终你的代码应该是这样的:
wprintf
修改强>
OP默认了Bjarne Stroustrup的建议并前往wprintf(L"Attempting to compress %ls%ls\n", WorkingDirectory, File);
wchar_t FileRawInput[MAX_PATH];
wcsncpy(FileRawInput, WorkingDirectory, MAX_PATH);
wcsncat(FileRawInput, File, MAX_PATH);
wchar_t bzipCompressedOutput[MAX_PATH];
wcsncpy(bzipCompressedOutput, FileRawInput, MAX_PATH);
wcscat(bzipCompressedOutput, L".bz2");
wprintf(L"Output of string bzip: %ls\n", bzipCompressedOutput);
wprintf(L"Output of string raw: %ls\n", FileRawInput);
:Concatenating char arrays together但是对于仍然坚持使用这些C风格函数的其他人来说,wstring
必须足够大容纳MAX_PATH
加上wsclen(WorkingDirectory) + wsclen(File) + wsclen(L".bz2")
字符,所以也许在这个函数上放置if语句会有用或者可能:
L'\0'