将char数组连接在一起

时间:2016-05-25 13:47:58

标签: c++ concatenation strcpy strncpy

几年前我会认为这是微不足道的......自从我涉足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}}。

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个字节,那么您错误地告诉sizeofwcsncpy您的字符数。 wscncat通常为2个字节:https://msdn.microsoft.com/en-us/library/s3f49ktz.aspx表示您正在有效呼叫wchar_t。踩踏内存100 wcsncpy(FileRawInput, WorkingDirectory, 200)超出你的分配范围。更正此问题将删除您的段错误。

但是为了打印宽字符串,您需要正确使用wchar_t修饰符%ls

最终你的代码应该是这样的:

wprintf

Live Example

修改

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'