0

ただし、私はC++があまり得意ではありません。私のコードはコンパイルされましたが、関数が私のプログラムをクラッシュさせます。以下はコードの簡単な要約です。完全ではありませんが、関数と呼び出しはそこにあります。

void rot13(char *ret, const char *in);

int main()
{
    char* str;
    MessageBox(NULL, _T("Test 1; Does get here!"), _T("Test 1"), MB_OK);
    rot13(str, "uryyb jbeyq!"); // hello world!
    /* Do stuff with char* str; */
    MessageBox(NULL, _T("Test 2; Doesn't get here!"), _T("Test 2"), MB_OK);
    return 0;
}

void rot13(char *ret, const char *in){
    for( int i=0; i = sizeof(in); i++ ){
        if(in[i] >= 'a' && in[i] <= 'm'){
            // Crashes Here;
            ret[i] += 13;
        }
        else if(in[i] > 'n' && in[i] <= 'z'){
            // Possibly crashing Here too?
            ret[i] -= 13;
        }
        else if(in[i] > 'A' && in[i] <= 'M'){
            // Possibly crashing Here too?
            ret[i] += 13;
        }
        else if(in[i] > 'N' && in[i] <= 'Z'){
            // Possibly crashing Here too?
            ret[i] -= 13;
        }
    }
}

関数は「テスト1;ここに到達します!」に到達します。-ただし、「テスト2;ここに到達しません!」には到達しません。

よろしくお願いします。-ニックダニエルズ。

4

2 に答える 2

2

strは初期化されておらず、で逆参照されているrot13ため、クラッシュが発生します。(スタック上または動的に)str渡す前にメモリを割り当てます。rot13()

char str[1024] = ""; /* Large enough to hold string and initialised. */

for内部のループrot13()も正しくありません(無限ループ):

for( int i=0; i = sizeof(in); i++ ){

への変更:

for(size_t i = 0, len = strlen(in); i < len; i++ ){ 
于 2012-05-09T14:27:30.353 に答える
0

いくつかの問題があります。

  • 出力にメモリを割り当てることはありません。変数を初期化することはありませんstr。これがクラッシュの原因です。

  • ループ条件は常にtrueと評価されます(=割り当てられた値を割り当てて返し、==等しいかどうかをテストします)。

  • ループ条件はsizeof(in)、入力文字列のサイズを取得する目的で使用されますが、実際にはポインタのサイズが得られます。strlen代わりに使用してください。

  • アルゴリズムは、戻り文字列の値を13ずつ増減します。出力文字列に配置する値は、入力文字列に基づく必要がある場合、出力文字列の初期値から+/-13です。

  • アルゴリズムは「A」、「n」、または「N」を処理しません。

  • アルゴリズムはアルファベット以外の文字を処理しませんが、使用するテスト文字列には2つ含まれています。

于 2012-05-09T14:32:15.813 に答える