在C中浏览二维数组

时间:2012-03-17 06:31:15

标签: c turbo-c

我想逐个打印二维数组的值。 但我的代码多次显示一个项目:(

#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


您好
ELLO
LLO

o

3 个答案:

答案 0 :(得分:2)

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

Hiii\0Hello

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

最后,数组的大小不正确。 "Hiii"的长度为5"Hello"的长度为6,因为每个字符串末尾都有一个隐式的空终结符\0。因此words实际上应该声明为char words[][6]={"Hiii","Hello"};。这也意味着cp现在每次都应增加6

通过更正,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);

答案 1 :(得分:0)

您正在使用(“%s”,cp) - 当您要打印一个字符cp时,打印以cp开头的空终止字符串。

答案 2 :(得分:0)

 char words[][5]={"Hiii", "Hello"};

字符串文字Hello长度为6个字符(包括空字符),但它正在初始化类型为char[5]的数组(请记住words是数组5的数组2 { {1}})。

当使用字符串文字初始化固定大小的数组(此处为char数组)时,只使用适合数组的元素数来初始化数组。

也就是说,char[5]的内存布局是:

words

Hiii\0Hello 的终止空字符未被复制,因为它不适合"Hello"对象。

(请注意,对于C来说,这是正确的,在C ++中,使用字符串文字初始化数组是无效的,字符串文字的字符数与数组中的元素数相同。)

在您的情况下,您希望为char[5]的已终止空字符留出一些空间,因此您应将"Hello"声明为:

words
相关问题