2011-08-10 2 views
0

これまで私は助けを求めることなくこれまでに来たが、私は修正できないような問題がある。私は暗号学が好きです。だから私はC++を学んでいるので、私は文字列を暗号化し解読するプログラムを作りたいと思っています。C++、テキスト中のASCII whileループエラー

#include <iostream> 
#include <string> 
#include <math.h> 
using namespace std; 

int main() 
{ 
    char strString[1000]; 
    cout<<"Enter you message:"<<endl; 
    cin>>strString[1000]; 
    string strEncrypt; 
    int a = 0; 

while (strString != '\0') 
{ 
    int b = (int)strString[a]; 
    strEncrypt.at(a) = b; //This is where I'm getting an error. 
    a++; 
} 

cout<<"Encrypted message:"<<endl; 
cout<<strEncrypt<<endl; 
} 

だから、私はしました:私は最善の方法は、私が試してみて、ASCIIにchar型の変数を変換するために、C++で作られたシンプルなプログラムはので、ここで、ASCIIにテキストを変換し、そこから行くことであることを読んでトラブルシューティングのために私が知っている3つのことをすべて試しました(Google、シミコロンがないかどうかを確認して、私が== not =をしていることを確認していますが、これは私が忘れている方法ではなく、 at()に渡されたインデックスが範囲外の場合(私は願っています)。だから、どんな手助けが!

+1

ASCIIの内容については、下記の回答を参照してください。これらを除いて、cin >>行はあなたが望むことをしていません。代わりに、cin.getline(strString、1000)を試してください。 もしあなたがC++について真剣なら、私はいくつかの簡単なチュートリアルを行い、参照のために "The C++ Programming Language"のような本を手にすることをお勧めします。 :) – mwd

答えて

1

あなたが作業しているコードを実際に作成する最も簡単な方法は、この行を変更することです。strEncrypt.at(a) = b;strEncrypt += b;に変更します。これにより、空の文字列strEncryptに文字が追加されます。

char型はすでにasciiですが、コードはあまり意味がありません。どのような種類の暗号化をしようとしているかについてもっと説明しなければならないでしょうし、正しい方向に向けることもできます。

EDIT:あなたはコードに基づいてもう少し何をしようとしているのか考えた後、数字のascii値を表示したいようです。 、あなたの入力はASCIIに既に存在するという事実の上に

string input; 
cout << "Enter you message:" << endl; 
// handle spaces in the message 
getline(cin, input); 

cout << "String chars as ascii values:" << endl; 
cout << "Char: " << "ASCII Code:" << endl; 

for (int i = 0; i < input.length(); ++i) 
{ 
    // casting the char to an int with (int) will print the ascii code 
    cout << input[i] << "  " << (int)input[i] << endl; 

} 
+0

私はそれを理解することができるようにあなたのコードにコメントを残していただきありがとうございます! –

2

string::at()は例外が素晴らしいスローします。あなたは、ランタイムエラーを取得しているのであれば、それは予想だ。あなたの文字列strEncryptに初期化され、ので""したがって、サイズはあなたが、彼らはすでにASCIIに文字を変更する必要はありません

strEncrypt.reserve(strlen(strString)); 
4

を試みるかもしれ0

です。 Charsは基本的にメモリ内の整数と同じです。

質問があります。 。文字列に文字を設定したい場合は、このようにすることができます。

string[index] = b; 

コードには注意が必要です。ユーザーから文字列を読み取るのにcinを使用しています。これにより、スペースを含むメッセージは読み取れず、最初の単語のみが読み取られます。例えば、ユーザが「Love Crypto」と入力した場合、cinは「Love」と「Crypto」は無視されます。行全体を取得するには、getlineを代わりに使用してください。文字列内の文字をループとしては、それは次のようにそれを行う方が良いでしょう

再び
for(int i = 0; i < strString.length(); i++) 
{ 
    strString[i] = bla; 
} 

、あなたはコード、実際に何もしていませんね。手紙を読んでから別の文字列に"letter"を格納するだけです。

+0

問題を解決してくれてありがとう、それは今働いている。助けがたくさんありがとう! –

+0

string.atは「読み取り機能」ではありません。http://www.cplusplus.com/reference/string/string/at/ OPの問題は、彼が範囲外インデックスを使用していたことでした。 – john

0

cin >> strString[1000]を行うことは、あなたのバッファの長さにキャプチャの入力を制限しないことに注意してください:あなたはこのようなだけのキャストであることを行うことができますストリームオブジェクトのキャプチャする文字数をsetw()で指定するか、またはios_base::widthデータメンバに設定しない限り、だからあなたのメソッドは、バッファオーバーフローを危険にさらします。

第2に、使用しているcin >>の形式では、入力行全体がキャプチャされません。代わりに、最初の空白またはその他の区切り文字(またはファイルの終端に達した場合はファイルの終わり)で停止します。あなたの場合、 "Hello World"のような行を入力すると、使用している構文は "Hello"を捕捉して "World"をドロップします。

はるかに良いアイデアは、例えば...あなたは、文字列への入力のラインをキャプチャし、バッファオーバーフローを危険にさらすことなく区切る改行文字を削除するには欠けている場合std::stringオブジェクトとgetline()機能を使用することです:

string strString; 
getline(cin, strString); 
0

この種の実行時エラーを受け取った場合は、Cppcheckユーティリティを使用してください。 これはあなたに答えを与えます: "メッセージ:配列 'strString [1000]'インデックスの範囲外1000"。