-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/p
Hiii
你好

意外的 o/p
Hiii
iii
ii
i

喂喂
喂喂
喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂
喂喂
喂喂

4

3 回答 3

2

首先,数组words布局在内存中

Hiii\0Hello

此外,由于cp是指向 的指针char,因此表达式恰好按字节cp++递增。cp那就是您正在打印"Hiii",然后是"iii"then"ii""i"。为正确起见,cp++应改为cp += 5.

最后,数组的大小不正确。is的长度和"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

cp您正在使用 ("%s ",cp) -当您想要打印一个字符cp指向时,打印以空字符结尾的字符串开始形式。

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

字符串字面Hello量有 6 个字符长(包括空字符),但它正在初始化一个类型的数组char[5](记住words是数组 5 的数组 2 char)。

当字符串字面量用于初始化固定大小的数组(此处为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 回答