2016-05-25 5 views
1

これは私が数年前には些細なことだと思っていたものです...私は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). 

をクラスであり、当面はそれをそのまま維持したいと考えています。私がしようとしているのは、RawFileInputのために2つの文字列を一緒に追加してからRawFileInputの値をbzipCompressionOutputに追加し、最後にを末尾にbzipCompressionOutputに連結します。 last page of chapter 4 in his book

+3

あなたは 'のstd :: wstring'を避けたいのはなぜ? – NathanOliver

+0

C++の使用を避けたい場合は、常にこの質問にC – KABoissonneault

+4

というタグを付けることができます。変更可能な 'wchar'バッファが必要な場合は' std :: vector'を使い、それ以外の場合は 'std :: wstring'を使います。このCスタイルの文字列ビジネスは貴重な時間を無駄にしています。 (重要な利点を証明することができない限り、これはそうではないと思われます。) –

答えて

2

: "C++プログラミング言語" Bjarne Stroustrup the creator of C++は言う:

は、それが唯一のアドバイスだが、私はそれに従うことをお勧めしたいstrings

Cスタイルの文字列を超える

を好みます。


しかし、あなたの本当の問題はないsizeof(FileRawInput)wchar_t sが同じくsizeof(bzipCompressedOutput)bzipCompressedOutput配列に存在しない、MAX_PATHwchar_t sが両方であるあなたのFileRawInputであるあなたは、メモリを踏みしていることです。問題はsizeofが配列のバイト数を教えてくれますが、各要素が1バイトより大きい場合は、wcsncpywscncatにあなたの文字カウントを間違って伝えてしまいます。 A wchar_tは一般に2バイトです:https://msdn.microsoft.com/en-us/library/s3f49ktz.aspxwcsncpy(FileRawInput, WorkingDirectory, 200)を効果的に呼び出すことを意味します。あなたが割り振っているものを超えてメモリをストンプする100 wchar_t。これを修正すると、segfaultが削除されます。

しかし、ワイド文字列を印刷するには、%ls修飾子をwprintfに正しく使用する必要があります。

最終的にあなたのコードは次のようになります。

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

Live Example

EDIT:

OPが wstringにビャーネ・ストロヴストルップのアドバイスを黙認して行ってきました

Concatenating char arrays togetherしかし、誰のためにこれらのCスタイル機能を使用することを依然として強く求めている人は、MAX_PATHは文字プラスは、ので、おそらくこの機能にif文を置くことは、おそらく役に立つかのようになります。

assert(MAX_PATH > wsclen(WorkingDirectory) + wsclen(File) + wsclen(L".bz2")) 
+1

私は私の問題を修正しました...しかし、私は文字列に移動するために上記の提案を取った。ああ、男があなたに弦を使用するよう指示しているのなら、それはおそらくすべきです。時間をいただきありがとうございます! – user0000001

+1

'sizeof(配列)'は 'sizeof(*)'と同じではありません。ただし、単位ではなくバイト単位で測定します。 – rici

+0

@rici '*'は 'FileRawInput'または' bzipCompressedOutput'のいずれかになることを意図していましたが、わかりました。私は怠惰を編集しました。 –

関連する問題