-3

必要に応じて、単語内のすべての文字を小文字にしようとする関数があります。プログラムをデバッグしたところ、この関数から segfault が発生していることがわかりました。word と lowerword は両方とも文字列です。

呼び出しは次のとおりです。

lowerword = word_to_lower(word);

関数自体は次のとおりです。

char * word_to_lower(char * word) {
  int i;
  char * lowerword;
  for (i = 0; i < strlen(word); ++i) {
    lowerword = (char *) tolower(word[i]);
    printf("%s\n", lowerword);
  }

  return lowerword;
}

私はCに非常に慣れていないので、詳細な説明をいただければ幸いです:)

4

3 に答える 3

2
lowerword = (char *) tolower(word[i]);
printf("%s\n", lowerword)

いや。(に割り当てることができる)をtolower()返します。intchar

char lowerword;
lowerword = tolower(word[i]);
printf("%c\n", lowerword)
于 2013-02-12T18:39:34.510 に答える
2

2 つの異なるものをキャストしようとしてcharいます。char*1 つ目は値 (文字)、2 つ目はポインター (文字が格納されているメモリ内の場所を指す変数) です。完全に処理された文字列を返したい場合は、最初に char のサイズの配列を割り当て、strlen(word)次に を呼び出してその要素 (つまり各文字) を適切な値に設定する必要がありますtoLower

最後に、次のようなものが必要です

char * word_to_lower(const char * word) {
  int i;
  unsigned int length = strlen(word);
  char * lowerword = (char*) malloc(sizeof(char) * length);
  for (i = 0; i < length; ++i) {
    lowerword[i] = tolower(word[i]);
    printf("%c\n", lowerword[i]);
  }

  return lowerword;
}

C の「ポインタ」と「配列」の背後にある概念、およびメモリの割り当てと解放のプロセスを理解していることを確認してください。あなたの使い方からすると、あなたはこれらに慣れていないようです。

EDIT : コメントで述べたように、この関数はconst char *パラメーターとして a を受け取る必要があります。

于 2013-02-12T18:50:44.910 に答える
1

文字列全体の大文字と小文字を区別したい場合:

void word_to_lower(char * word) {
  int i, len = strlen(word);
  for (i = 0; i < len ; ++i) {
      word[i] = tolower(word[i]);
  }
}
于 2013-02-12T18:46:20.100 に答える