1

私はこのコードを持っています:

void changeToCapital(char* str)
{
    int i;
    for (i=0; i<strlen(str); i++) 
    {
        str[i] =str[i] -32;
    }
}

このメソッドはchar*変数を取得し、それを大文字に変更することになっています。何らかの理由で、というエラーが表示されますEXECUTE_BAD_ACCESS

呼び出し関数:

char* s = "itzik";
changeToCapital(s);
printf("%s\n",s);

ここで何が間違っていますか?

4

2 に答える 2

12

これは、文字列リテラルから取得したものなど、書き込み不可能なメモリへのポインタを渡していることが原因である可能性が最も高いです。

char *ptr = "Hello";
changeToCapital(ptr); // <<== ERROR !

エラーを回避するために呼び出しを変更できます。

char ptr[] = "Hello";
changeToCapital(ptr);

ちなみに、大文字への変更は、すべての文字が小文字の場合にのみ機能します。toupper(ch)32 を引く代わりに関数を使用する必要があります。

void changeToCapital(char* str) {
    for (; *str = toupper(*str) ; str++)
        ;
}
于 2012-05-21T17:38:05.663 に答える
4

初め:

あなたは常に計算してstrlenいます。代わりに、文字列の長さをローカル変数に格納する必要があります。

2番目:おそらく次のように関数を呼び出しています:

char *str = "Hello World";
changeToCapital(str);

これは悪いです。"Hello World"でありconst、プログラムで変更することはできません。代わりに、文字列を文字配列として指定して、不変であることを確認する必要があります。

char str[] = "Hello World";
changeToCapital(str);
于 2012-05-21T17:39:28.410 に答える