0

「果物」配列の文字列と同じ回数だけループを繰り返したいと思います。

「while」ループを使用して最初に試してみましたが、(デバッガーが示したように) 4 回目の反復でセグメンテーション違反が発生したため、適切に動作させることができませんでした (現在はコメントされています)。このメソッドは、文字または整数の配列では機能するはずですが、文字列の配列では機能しません。なぜこのようになっているのですか?

次に、「for」ループを使用しようとし、「count」変数に格納された配列内の文字列要素の総数に達したときに停止するようにしました。しかし、配列内の文字列の数を数える良い方法が見つかりませんでした。それは可能ですか?「sizeof」演算子は、ここでは良い解決策とは思えません。

返信ありがとうございます。

#include <stdio.h>

int main()
{
    char *fruits[]={"Apple", "Grapefruit", "Banana"};
    int i=0;
    int count=sizeof(*fruits);


    char **bitter=&fruits[1];

    printf("Bitter fruit is: %s", *bitter);

    puts(" ");

    printf("All fruits are: ");

    for (;i<count;i++);
    {
        printf("%s ",*(fruits+i));
    }

    /*
        while ( fruits[i] != '\0')
        {
        printf("%s ",*(fruits+i));
        }

    stuff above failed. why?
    */


    return 0;
}
4

3 に答える 3

4

簡単な方法は、リストに NULL を追加することです。

char *fruits[] = {"Apple", "Grapefruit", "Banana", NULL};

次に、次のようにすべての果物を印刷できます。

int i = 0;
while (fruits[i] != NULL) {
    printf ("%s ",*(fruits+i));
    i++;
}

元のwhileループが失敗した理由について:

  • あなたiはインクリメントされません
  • fruits[i] != '\0'wherefruits[i]がポインタでcharあり'\0'、 0 にchar等しいかどうかをチェックしています。つまり、基本的fruits[i]に 0 を指しているかどうかをチェックしていますが、最初の 3 回の反復fruits[i]では、それぞれの果物の最初の文字を指し、4 番目の反復ではそうではありません。繰り返しfruits[i]は、プログラムに属していないメモリの場所を指しています。
于 2012-08-26T09:19:38.597 に答える
-1

ヘッダー string.h から strlen() を使用することも検討できます。

#include <stdio.h>
#include <string.h>
int main()
{
    char *myarray[] = {"Mere", "Pere", "Gutui"};
    int i = 0;
    int lungime = strlen(*myarray);

    while (i < (lungime - 1)){
            printf("Fruit no. %d is %s\n", i, *(myarray + i));
            i++;
    }
    return 0;
}
于 2016-08-04T13:49:32.327 に答える