2017-01-07 9 views
-1

私はこのC++コードがアファイン暗号での暗号化に有効だと思います。しかし、出力には通常のアルファベットではなく奇妙な文字が表示されます。なぜか分からない。 0にあなたの変数coprimetestを初期化し、私はstd::cin >> whatever;を使用してコンソールに入力した文字列の長さのために私はまでその文字列内のすべての文字の変更文字を取得していますことがわかり、この数回実行した後アファイン暗号化をC++で

#include<iostream> 
#include<string.h> 
#include<stdlib.h> 
#include<cstring> 
#include<conio.h> 
using namespace std; 

int main() 
{ 
cout << "Enter string: "; 
char whatever[20]; 
gets (whatever); 
char something [20]; 
int a; 
int b = 8; 
int m = 26; 
int coprimetest; 

for (a=2;coprimetest!=1;a++) 
{ 
    for (int i=1;i<=a&&i<=m;i++) 
    { 
    if (a%i==0 && m%i ==0) coprimetest=i; 
    } 
} 

for (int i = 0; i < sizeof(whatever); i++) 
    something [i]= (char)((((a * whatever[i]-65) + b) % m)+65); 

for (int i=0; i < sizeof(something); i++) 
    cout << something[i]; 

} 
+1

これはおそらく問題ではありませんが、最初のループでは、それを初期化する前に 'coprimetest'の値をチェックしています。これにより、未定義の動作が発生します。これは、過度の積極的な最適化のためにコンパイラによって悪用される可能性があります。 – eran

+0

あなたのコードをテストしています私はあなたの問題を経験していません:コードはすべての入力または特定のものに対して奇妙な文字を出力しますか?なんらかの理由で何らかの理由でprintable charの範囲外のascii値の範囲を移動させると、初期化されていないvarが部分的に責任を負う可能性があります。 – sergico

+0

@Ayatoまた、バッファに 'something'と' whateverそれは同じ入力を与えれば異なる出力を得ていることを意味し、コード – sergico

答えて

0

最初の空白文字。だから私が"Hello"に入力すると、私は"XJLLX<<<<<<<<<<<<<<<"をforループからコンソールに出力しています。今私が試してみたら"Hello World"私は同じ正確な出力を得ています。私が試してみると"HelloWorld"私の出力は今や"XJLLXFXJLF<<<<<<<<<<"です。値"1234567890"は私に"JNRVZDHLPF<<<<<<<<<<"を与えます。値"abcdefghijklmnopqrst""TXBFJNRVZDHLPTXBFJNF"となります。値"uvwxyzABCDEFGHIJKLM""VZDHLPVZDHLPTXBFJNRV"です。文字列に正確に20文字を入力する唯一のことは、正常に印刷されますが、次のコード行の後に、私のユーティリティ関数の1つである"Press Any Key To Quit"に別のメッセージを送ります。このプログラムはクラッシュして、エラーメッセージ「Run-Time Failure #2 - Stack around the variable "whatever" was corrupted.」をMSVS2015 CEから取得しています。知っているだけのこと。

+0

私はそれを得るために、20文字を正確に入力する必要があります。 – Ayato

+0

@Ayato正確に20文字を入力すると、ランタイムに失敗してプログラムがクラッシュします。 char []で作業するときにiostreamのcin&coutを使用する必要があるかどうかは分かりませんが、代わりに文字列を使用し、char []と同じ方法で文字列を繰り返し処理することを検討してください。このようにして、空白も組み込むことができます。 –