-1

2次元配列の値を1つずつ出力したいと思います。しかし、私のコードは1つのアイテムを何度も表示します:(

#include<stdio.h>
#include<conio.h>

void main()
{
    char words[][5]={"Hiii","Hello"};
    int size;
    char *cp,*p;
    p=words;
    clrscr();
    printf("%p ",p);
    size=sizeof(words);
    printf("Size %d\n",size);
    for(cp=p;cp<(p+size);cp++)
        printf("%s ",cp);
    getch();
}

期待されるo/
pHiii
こんにちは

予期しないo/p
Hiii
iii
ii
i

こんにちは
ellollolo o
_
_

4

3 に答える 3

2

まず、配列wordsは次のようにメモリに配置されます

Hiii\0Hello

また、cpはへのポインタであるためchar、式は正確にバイト単位でcp++インクリメントされます。cpそれはあなたが印刷しているということです"Hiii"、そして"iii"その後"ii""i"。正確を期すために、cp++に変更する必要がありますcp += 5

最後に、アレイのサイズが正しくありません。各文字列の最後に暗黙のヌルターミネータがあるため、の長さは"Hiii"is5で、の長さは"Hello"です。したがって、実際にはとして宣言する必要があります。これは、毎回インクリメントする必要があることも意味します。6\0wordschar words[][6]={"Hiii","Hello"};cp6

修正を加えると、forループは次のようになります。

for(cp=p;cp<(p+size);cp+=6)
  printf("%s ",cp);

配列を使用しているので、作業を楽にするために、ポインター演算に依存するのではなく、インデックスを使用できます。

int strCount = size / 6; // since each element of words is 6 characters long
for(int i = 0; i < strCount; i++)
    printf("%s ", cp);
于 2012-03-17T06:47:30.940 に答える
0

使用している( "%s"、cp)-文字が指す文字を出力する場合は、nullで終了する文字列の開始フォームcpを出力cpします。

于 2012-03-17T06:41:51.270 に答える
0
 char words[][5]={"Hiii", "Hello"};

文字列リテラルのHello長さは6文字(ヌル文字を含む)ですが、型の配列を初期化しています(の配列5の配列2であることをchar[5]思い出してください)。wordschar

文字列リテラルを使用して固定サイズの配列(ここではchar[5]配列)を初期化する場合、配列に適合する要素の数のみが配列の初期化に使用されます。

つまり、のメモリレイアウトwordsは次のとおりです。

Hiii\0Hello

の終了ヌル文字はオブジェクト"Hello"に適合しないため、コピーされません。char[5]

(これはCにも当てはまります。C++では、配列内の要素数よりも多くの文字を含む文字列リテラルで配列を初期化することは無効です)。

あなたの場合、の終了したヌル文字のためのスペースを作りたいので、次の"Hello"ように宣言する必要がありますwords

 char words[][6]={"Hiii", "Hello"};
              ^ instead of 5
于 2012-03-17T08:09:27.450 に答える