• ベストアンサー

暗号化の際の「0」になる対策方法について

暗号化の際の「0」になる対策方法について質問です。 (文字で言うと「'\0'」ですが「0」と書きます。) 開発環境はC、C++です。 暗号化をする時、例えばXORで同じ文字同士の場合は「0」になりますが、 「0」になると、「printf」や「fprintf」などで「0」以降の文字が無視されますが、 こういう場合はどうすればいいのでしょうか? 対策としては他の文字にするしかないと思うのですが、 どの文字が「0」だったか分からなくなるので困っています。 ちなみに、char型をunsigned char型にして暗号化してchar型に戻しています。 本当はあまり良くないとは思いますが。 char型のままだとうまくできなかったからです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 具体的なソースコードが解らないので、想像ですが、'\0'は文字列の終了を示しているコードなので、 <上手くいかないと思われる原因1>  書式を%sにした場合は文字列がそこで終了したとみなされてしまいます。そこで%cで1文字ずつ処理をすればよいのではないでしょうか? <上手くいかないと思われる原因2>  1文字ずつ処理したとしても、全体をwhile文などで囲って   while(str[i++]){ 1文字ずつの処理   } としていると、while文の条件式が偽(Cで真は0以外、偽は0)になってそこで終了してしまいます。この場合は、文字列の長さ(¥0を含めた)を調べ、その長さ分ループさせればよいのではないでしょうか? >char型のままだとうまくできなかったからです。  charとだけ宣言したとき、signed charになるのかunsigned charになるのかは処理系依存です。そして、signed charに対してビット操作を施した場合の結果もまた処理系依存になることがあります。  例えば、シフト演算は算術シフトと論理シフトがありますが、signed charで負の数をシフトした場合、どちらのシフトが行われるかは処理系毎に異なりますので、行ってはいけません。 

noname#154655
質問者

お礼

回答ありがとうございます。 確かに1文字ずつすれば出来ますね。 そのことまで考えてませんでした。

その他の回答 (1)

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

fprintf を使わなけれよいだけだと思いますが。

関連するQ&A