3

文字の配列を引数として取り、すべての文字を小文字に変換する単純な関数があります。ただし、奇妙なアクセス違反エラーが発生します。コードは次のとおりです。

void toLower(char *rec)
{
 int i=0;
 while (rec[i]!='\0')
 {
  if (rec[i]>='A' && rec[i]<='Z') 
               rec[i]='a'+rec[i]-'A';  //this is where I get an error - assigning the
                                       //the value to rec[i] is the problem
  i++;
 }
}

私の間違いは何ですか?ありがとう

4

4 に答える 4

6

(間接的であっても) 文字列リテラルを渡していますか? その場合、書き込み不可のメモリにロードされている可能性があります。コピーを変更する必要があります。

関数プロトタイプが achar *ではなく aを取るというconst char *ことは、おそらくこれを行っていないことを示唆していますが、私はそれを捨てようと思いました。

于 2010-04-14T14:16:24.663 に答える
6

あなたは頑張りすぎです:)

#include <algorithm> //For std::transform
#include <cctype> //For std::tolower
#include <cstring> //For std::strlen

void toLower(char *rec)
{
    std::transform(rec, rec + std::strlen(rec), rec, std::tolower);
}
于 2010-04-14T14:10:59.363 に答える
6

コメントでは、次のようにリテラル文字列を関数に渡すと述べています。

palindrome("In girum imus nocte et consumimur igni")

wherepalindromeはその引数を に渡しますtoLower。文字列リテラルは読み取り専用であり、変更しようとしているため、これは機能しません。代わりに、次を使用できます。

char str[] = "In girum imus nocte et consumimur igni";
palindrome(str);

またはpalindrome、その引数を配列にコピーして、それを呼び出すことができますtoLower

于 2010-04-14T14:32:54.307 に答える
1

有効なバッファを渡さなかったようです。しかし、これを自分で書かないでください。strlwrのようなものを使用してください。

于 2010-04-14T14:12:23.673 に答える