1

これはかなり基本的なことのように感じますが、何らかの理由で行き詰まっています。

これが私が持っているものです:

char *rot13(char *s)
{        
    char *p=s;        
    int upper;

    while (*p) {    
        upper=toupper(*p);              
        if (upper >='A' && upper <= 'M')
            *p+=13;  
        else if (upper>='N' && upper <= 'Z')
            *p-=13;  
        ++p;    
    }       
    return s;
}

私はCの第一人者ではありませんが、それは些細なことだと私は確信しています。私が得るエラーは、char修飾子(*p+=13または*p-=13)のいずれかにヒットすると、「############で未処理の例外:アクセス違反の書き込み場所#####」が発生します。

私は何が間違っているのですか?

ありがとう

4

2 に答える 2

8

おそらくrot13()、実際の引数として(ポインタへの)文字列リテラルを使用して呼び出していますか?文字列リテラルはCでは読み取り専用です。何かを試してみてください

char foo[] = "YOUR STRING TO BE ROT13'D IN-PLACE.";

rot13 (foo);
于 2012-09-06T20:40:52.287 に答える
1

pmgが言ったように、FAQを読んでください。次の例は、正しい方向に導くのに役立つ場合があります。

次に、char配列ではなくcharへのポインタを使用する例を示します。

char *foo = malloc(36); // 35 + 1 for ending '\0'
strcpy(foo, "YOUR STRING TO BE ROT13'D IN-PLACE."); // requires #include <string.h>
printf("%s\n", rot13(foo));
于 2012-09-06T23:44:16.413 に答える