0

C で独自の toUpper 関数を作成していますが、実行しようとするたびにセグメンテーション エラーが発生します。この問題を解決する方法についてのヒントを誰かに教えてもらえますか?

int toUpper(char *str)
{
    int i;
    for(i=0;i< i <= strlen(str); i++) {
        if(str[i] >= 97 && str[i] <= 122) {
            str[i] = str[i] -32;
        }
    }
    return(str[i]);
}

int main()
{
    char string[20];

    printf("Enter any string:\n");
    scanf("%s", string);

    char result= (char)(toUpper(string));

    printf("The string in upper case is:%s\n", result);
}
4

4 に答える 4

7

あなたは文字列の終わりを実行しています:

for(i=0;i< i <= strlen(str); i++) {
              ^--

たとえば、10 文字の文字列には文字 0->9 がありますが、0->10 をループしています。9 で止まるように変更<=します。<

さらに、scanf に制限を設定していないため、誰かが 21 文字の文字列を入力すると、string配列に割り当てたストレージを超えてしまいます。

于 2014-10-28T20:32:57.853 に答える
2

次のように変更toUpper()することをお勧めします:

char *toUpper(char *str) {
  size_t len = strlen(str);
  size_t i;

  for (i = 0; i < len; i++) {
    if (str[i] >= 'a' && str[i] <= 'z') {
      str[i] = str[i] - 'a' + 'A'; 
    }
  }
  return str;
}
  1. i < strlen(str)に対して正しいインデックス範囲を使用しますi <= strlen(str)。これが主な問題です。@マークB

  2. 戻り値のタイプを変更します。@Weather Vane の提案。のようstrcpy()に、strcat()

  3. 文字列の長さを何度も計算するのではなく、1 回計算します。

  4. 'a'の代わりに、目標に一致するリテラルを使用してください97。@マーシュ

  5. size_tインデックスと長さに使用します。これは by によって返される型strlen()であり、配列アクセスに使用するのに最適な型です。巨大な文字列では違いがありますが、これらの単純な例では違いがありません。

  6. このコードは ASCII に依存します。多くの場合、これで問題ありませんが、完全に移植できるわけではありません。

  7. 32 を-'a' + 'A'@ user295691 ごとに変更します

于 2014-10-28T20:51:11.890 に答える
1
printf("The string in upper case is:%s\n", result);

結果は char * である必要がありますが、char です。これはおそらく、セグ障害が発生している場所です。他の場所は次のとおりです。

scanf("%s", string);

入力された文字列が 19 文字を超える場合、文字列の長さが 20 文字しかないために問題が発生する可能性があります

  for(i=0;i< i <= strlen(str); i++) {

何らかの理由で str の末尾が 0 でない場合は、そこにも障害をセグメント化できます。

于 2014-10-28T21:03:55.993 に答える