0


現時点では、C でいくつかのポインターを試しています。しかし、現在、ポインター配列に問題があります。以下のコードを使用すると、奇妙な出力が得られます。コードに大きな間違いがあると思いますが、見つけられません。

ポインタ配列の文字列を出力したいだけです。

#include <stdio.h>


int main(void)
{
    char *words[] = {"word1", "word2", "word3"};
    char *ptr;
    int i = 0;

    ptr = words[0];

    while(*ptr != '\0')
    {
        printf("%s", *(words+i));
        ptr++;
        i++;
    }

    return 0;
}

出力: word1word2word3Hã}¯Hɡ

助けてくれてありがとう。

4

2 に答える 2

3
while(*ptr != '\0')
{
    printf("%s", *(words+i));
    ptr++;
    i++;
}

最初は、inptrを指します。したがって、ループは まで 5 回繰り返されます。しかし、配列には 3 つの要素しか含まれていないため、4 回目と 5 回目の反復では未定義の動作が発生し、配列の後のバイトが 0 で終わる文字列へのポインターとして解釈されると、ガベージが出力されます。簡単にクラッシュする可能性があり、他のシステムで他のコンパイラーまたはコンパイラー設定を使用して試すと、クラッシュすることがあります。'w'"word1"*ptr == '\0'wordswords

ループを次のように変換できます

for(i = 0; i < strlen(words[0]); ++i) {
    printf("%s", words[i]);
}

それが何をするかをより簡単に見るために。

配列内の文字列を出力したい場合はwords、次を使用できます

// this only worls because words is an actual array, not a pointer
int numElems = sizeof words / sizeof words[0];
for(i = 0; i < numElems; ++i) {
    printf("%s", words[i]);
}

実際の配列と同様wordsに、含まれる要素の数は を使用して取得できますsizeof。次に、配列に含まれる要素の数だけループします。

于 2012-11-22T22:11:39.780 に答える
1

ptr配列内のアイテムを繰り返し処理するつもりだったと思いますwordsが、実際には " word1" の文字を繰り返し処理しています。反復するwords項目の数がわからないふりをしながら配列を反復処理するには、while 条件を次のように変更します。

int main(void)
{
    char *words[] = {"word1", "word2", "word3"};
    char numWords = sizeof(words) / sizeof( words[0]);
    int i = 0;

    while(i < numWords)
    {
        printf("%s", *(words+i));

        i++;
    }

    return 0;
}

ptr を使用して words 配列の項目を繰り返し処理する場合は、words 配列と while 条件を次のように変更します。

int main(void)
{
    char *words[] = {"word1", "word2", "word3", NULL};
    char *ptr[] = words;
    int i = 0;

    while(ptr[i] != NULL)
    {
        printf("%s", *(words+i));

        i++;
    }

    return 0;
}
于 2012-11-24T05:27:23.320 に答える