1

次のコードを使用して、文字列をすべて大文字に変換しようとしています。

int client::get_upper(char*item_in)
{
    int k ;
    char * temp_str;
    int length = strlen(item_in);
    temp_str = new char [length+1];
    for(k = 0; k < length; ++k)
        temp_str[k] = toupper(item_in[k]);
    temp_str[k] = '\0';
    for(k = 0; k < length; ++k)
        item_in[k] = temp_str[k];
    return 0;
}

しかし、そうしようとすると、Visual Studio から場所 xxxxxxxx を書き込むアクセス違反が発生します。これはクラス用なので、実際の文字列を使用することは制限されています。

4

5 に答える 5

2

コードを適切に使用すれば機能します(最も簡単な方法は、このようなローカルcstringを渡すことです)。

char test[] = "stackoverflow.com";
client::get_upper(test); // client interpreted as a namespace

これで、関数は悪いアプローチ、つまり管理されないままになっている冗長コピー(メモリリーク)でいっぱいになります。

少し書き直しました:

int client::get_upper(char *item_in)
{
    unsigned int length = strlen(item_in);
    for(int i = 0; i < length; ++k)
        item_in[i] = toupper(item_in[i]);

    return 0;
}

あなたが少し実験したいなら、ここにあなたのために何か、ただ楽しみのために:

int client::get_upper(char *item_in)
{
    int length = strlen(item_in);
    for(int i = 0; i < length; ++i)
        if((item_in[i] >= 97 && item_in[i] <= 122))
            item_in[i] = (int)item_in[i] - 32; 

    return 0;
}

そして、あなたのエラーはおそらく、あなたがおそらく実際には考えていなかった文字の動的配列をプッシュしようとしているという事実から来ています。ローカル文字列、単純なnullで終了する配列を使用するだけです。あなたは実際に続けるために多くを与えなかったので、これは単なる推測の仕事です。私にできることは、表現を単純化するのを手伝うことだけです。戻り値は何もしないので、何かに適用するか、に切り替えることを検討してvoidください。

それが役に立てば幸い。

于 2012-05-24T03:16:18.863 に答える
0

標準の文字列クラスの使用が許可されていないからといって、これをモノリシック関数として記述しなければならないわけではありません。

その場で変換を行う単純な関数を作成します。次に、読み取り専用文字列の操作をサポートする必要がある場合は、入力を複製する別の関数を記述し (さらに 3 番目の関数を使用)、複製に対してインプレース変換を行います。

char *duplicate(char const *input);

char *upper_str(char *input); // does in-place transformation

char *upper_str(char const *input); // duplicates, then transforms the duplicate
于 2012-05-24T03:36:04.330 に答える
0

そのコードを正しく呼び出すと仮定すると、temp_str[k] = '\0'; で off-by-one エラーが発生していると思います。

于 2012-05-24T02:52:59.137 に答える
0

get_upper を呼び出すときに、文字列リテラルを渡しましたか? たとえば、呼び出しコードは次のようなものですか。

char *mystr = "stackoverflow.com";
client.get_upper(mystr)?

これにより、Visual Studio でアクセス違反が発生する可能性が高くなります。

この場合、mystr の定義を次のように変更できます。

char mystr[] = "stackoverflow.com";
于 2012-05-24T02:56:04.147 に答える
0

関数がどのように呼び出されているかを見ないと、なぜエラーが発生するのかわかりません。

私の疑いは、エラーが呼び出しコンテキストと item_in が実際に指しているものに関係しているということです。

Jeremy Friesner のコメントは的を射ています。リークがあり、これが破壊的であることが目標である場合、とにかく中間バッファは必要ありません。

于 2012-05-24T02:57:50.323 に答える