2017-10-03 12 views
-2

私は自分のコードで乱雑な文字列を持っています。C++:特殊文字を含むXORの文字列は生の文字列リテラルとしてコンパイルされませんか?

ただし、結果として得られる複数行の生の文字列リテラルは正しくコンパイルされません。

次の図では、両端で適切なデリメータを使用していても、MSVS2015が文字列を正しく解析していないことがわかります(文字列の一部として解析されない黒いテキストに注意してください)。

コードをコンパイルしようとすると、リテラルの閉じ括弧を見つけることができないというエラーが発生します(正しい区切りであっても、閉じた区切り文字の後ろの文字列の最後など)。黒ビットを手動で消去すると適切なコンパイルが行われます(もちろん、正しく解読できなくなった文字列でも)。

enter image description here

XOR機能の様々な結果として生じる文字が正しく.hファイル内に保存することができないので、私はこれが起こっていると仮定しています。この問題の解決法はありますか?私は、Unicodeにファイル形式を切り替えてみましたが、うまくいきませんでした。

+1

コードの印刷画面を表示しないでください。 – bolov

+3

おそらく、あなたの文字列をエンコードする他の方法を考慮する必要がありますか?おそらく何らかの種類の16進符号化スキームや、プレーンなASCII文字をもたらす何か?もちろん、文字列リテラルが[to long]でないことを確認してください(https://msdn.microsoft.com/en-us/library/sx08afx2.aspx)。 –

+0

@ user23573彼は生の弦を使用しています。エスケープ文字は問題ではありません – bolov

答えて

0

生の文字列を使用するのは単純すぎます。シーケンス..|..が区切り文字として使用されると、おそらく文字列の最後にシーケンス)..|..がありません。

バリアント(6)のin cppreferenceに記載されているように、区切られた生の文字列の完全な仕様を使用してください。これは、C++標準の§2.14.5文字列リテラルにも記述されています。次のようにテンプレートがある:

R」D-CHAR-シーケンスあなたの生のテキストD-CHAR-シーケンス "

キーは" を使用することですd-char-sequence "である。このシーケンスは、以下を含めることができます。

除いて設定した基本ソース文字の任意のメンバー: スペース、左括弧(右括弧)、バックスラッシュ\、 および水平タブを表す制御文字、 垂直タブ、フォームフィード、改行などがあります。次のように記載されているどのようにD-チャー配列作品

プレフィックスにRを有しているリテラル文字列リテラル生の文字列です。 d-char-sequenceはデリミタとして機能します。生の文字列の終了d文字列は、最初のd文字列と同じ文字列です。 d文字シーケンスは最大16文字で構成されます。

これにより、元の文字セット(ここではUnicode)でサポートされている任意の文字を生の文字列に確実に含めることができます。生の文字列には、カッコで囲まれたバックスラッシュや改行を含めることができます。

聞こえるほど複雑ではありません。生の文字列に接頭辞と接尾辞を追加するだけです。

std::string(R"my-delimiter(... long text ...)my-delimiter"); 

もちろん、生の文字列リテラルで... long text ...を置き換えてください。シーケンス)my-delimiter"が生の文字列のテキストに表示されないようにしてください。

+0

これは、質問ごとに「手動で黒ビットを消去すると適切なコンパイルが行われる」という理由が説明されていません。デリミタが最後にない場合は、途中の文字列を削除してもそれが修正されません。 – MSalters

+0

元の質問に記載されているように、最後に適切なデリミタがあります。 – Tyson

関連する問題