我想逐个打印二维数组的值。 但我的代码多次显示一个项目:(
#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
答案 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