2012-02-11 22 views
0

私は、ユーザーが入力した各文字を '*'に変換するC++の関数を作成しようとしました。しかし、私が.exeファイル(CMD)を実行すると、パスワードを尋ねられますが、単語を入力すると「Debug assertion failed」というエラーが表示されます。なぜこのようなことが起こるのか?C++の暗号化機能

ここに私のコードです:

#include "stdafx.h" 
#include "iostream" 
#include "conio.h" 
#include "string" 
#include "ctype.h" 

using namespace std; 

void encrypt(char string[], int len) 
{ 
    for (int count = 0; count < len; count++) 
     if (isalpha (string [count])) 
      string[count] = '*'; 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char Text[40]; 
    int Size = strlen(Text); 
    cout << "Enter your desired password: "; 
    cin >> Text; 
    encrypt(Text, Size); 
    cout << Text << endl; 
    _getch(); 
    return 0; 
} 
+1

デバッガを使用してコードをステップ実行しようとしましたか?エラーが投げられたときに? – RvdK

+0

あなたの質問はWindows固有のものです。あなたのコードはPosixシステム上で動作しません! Linuxはhttp://linux.die.net/man/3/cryptを提供します。 –

+0

これは私の暗号化のようには見えません。あなたの関数は文字列中のすべてのアルファベット文字をアスタリスクに変換するだけです。 – IanNorton

答えて

2

ちょうどCIN >>テキスト「行の後にint型のサイズ=のSTRLEN(テキスト) "を動かす;"

0

のstrlen(テキスト)文字列のな長さをバック与えます「\ 0」を検索することで、ユーザーがテキストを入力した後。あなたがこれを行う必要があります。

char Text[40]; 
cout << "Enter your desired password: "; 
cin >> Text; 
int Size = strlen(Text); 
encrypt(Text, Size); 
0

あなたはテキストが入力された前からのテキストのサイズを取った。

... 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char Text[40]; 
    // int Size = strlen(Text); // to early 
    cout << "Enter your desired password: "; 
    cin >> Text; 
    int Size = strlen(Text); // now Text is filled and the Size will not change. 
    encrypt(Text, Size); 
    cout << Text << endl; 
    _getch(); 
    return 0; 
} 
1

あなたのforループは、入力テキストの長さを考慮しません。代わりに、通常、ランダム値でいっぱいになる、初期化されていないchar配列のstrlenを呼び出すことによってSizeを供給します。 あなたのコンパイラは、このについて警告する必要があります。常に警告を無視しないでください。

char Text[40]; 
int Size = strlen(Text); 

それはそれはおそらくそうあなたのランタイムエラー(セグメンテーション違反を与え、あなたのスタックのいくつかの他の部分に40文字スペースの最後の脱落さNUL(0x0の)を見つけるまではstrlenは文字のシーケンスを以下のとおりテキストは、ユーザーが入力されていなかったとして)

0

あなたは、あまりにも早くライン

int ln 〓 strlen(Text); 

を置きます。次の行の後に移動する必要があります。

cin >> Text;