2016-10-26 13 views
0

2つのCスタイルの文字列で大文字と小文字を区別しないstrcmpを実行しようとしています。Cスタイルの文字列のtolower

私はCスタイルの文字列を小文字に変換する機能を持っています。

char* ToLowerCase(const char* str) 
{ 
    char buffer[strlen(str)]; 
    for (int i=0; i<strlen(str); ++i) 
     buffer[i] = char(tolower(str[i])); 
    return buffer; 
} 

1つの文字列は、GetMyString(IをINT)*機能チャーから来て、そして第二には、Cスタイルの文字列のchar * myStringsの配列である[5]。だから、GetMyString(0)とのmyStringの両方が[0]の両方のリターン "TEXT"

strcmp(ToLowerCase(GetMyString(0)), ToLowerCase(myStrings[0])); 

は "mytextxaogs5atx" "mytextxabs5atx"(いくつかのランダムなテキストが追加されます...)

のような文字列を比較することを想定し

私はあなたのいくつかは、と思うかもしれないとしてNULL終了とは何の関係はありませんと仮定して

strcmp(GetMyString(0), myStrings[0]); 

ながら

は、うまく動作します。

私のコードで何が問題になっていますか?私は何か見落としてますか?私はtolowerに関する多くの質問を見てきましたが、誰も私の問題を助けることができませんでした。

+0

あなたは未定義の動作をしています。そのためです。 –

+0

このような関数を重大なプロジェクトに使用する必要がある場合は、異なる文字セットの問題を避けるためにboostライブラリに行ってください。 – seccpur

+0

返された後に未定義になるバッファを返しています。 'char(tolower(str [i]))'とはどういう意味ですか? 'tolower(str [i])'は十分なはずです – Holger

答えて

1
return buffer; 

あなたはToLowerCaseにローカルだ変数へのポインタを返し、ポインタはポインタを参照解除しようとすると、未定義の動作が得られ、呼び出しの後にゴミを指します。 str自体を変更するか、bufferのためにメモリを動的に割り当ててください。

+0

うわー、私はそれを知らなかった!解説をいただきありがとうございます。 – Ilo

3

関数からローカル変数を返すことができないので、bufferを返すことは未定義の動作です。

あなたはこのAPIを作るための3つの選択肢があります。

  • は、発信者から文字列のバッファを取り、どちらかそれは十分持っていることを前提と非const strを取り、場所
  • に修正を行います長さ、またはバッファのサイズを取る(はるかに安全)
  • malloc文字列を返します。これにより、呼び出し側は結果を解放する必要があります。このルートに進むことを決定したら、ヌルターミネータに対応するにはmallocstrlen(str)+1バイトが必要です。
関連する問題