一个用指针做参数的WHILE是如何控制循环次数(有实例)
我在做去年程序员试题的时候对他们使用的WHILE是如何控制循环次数的不太清楚,想请教一下大家:
main()
{ char a[]={'a','b','c'};
char b[]={'e','c','e'};
char *a1;
int n, i,j=1;
a1=a;
/*n=sizeof(a); printf("%d\n",n); */
while(*a1!='\0')
{ printf("%d",j++);
for(i=0;i<3;i++) printf("%c ",a[i]);
printf("\n ");
*a1++; }
}
该程序运行结果如下:
1a b c
2a b c
3a b c
4a b c
5a b c
6a b c
7a b c
8a b c
9a b c
将/*n=sizeof(a); printf("%d\n",n); */的/* */去掉并且同程序一同运行,结果如下:
3
1a b c
2a b c
3a b c
4a b c
5a b c
6a b c
7a b c
将char b[]={'e','c','e'};行删除,运行结果如下:
3
1a b c
2a b c
3a b c
问题:为什么每次跳出 while(*a1!='\0')循环的次数都不一样?是什么参数被修改?是怎么被修改?
问题点数:5、回复次数:7Top
1 楼Yashmak(双层面纱)回复于 2003-08-02 05:46:50 得分 1
呵呵,常识性错误
没有设定字符串结尾的'\0'
Top
2 楼lonelyplanet(大地任我行)回复于 2003-08-02 06:00:01 得分 3
1) *a1!='\0'是while循环执行的条件,就是说*al=='\0'是循环终止
2) 在这里*al++与al++意思一样(因为++运算符优先级高于*运算符),表示指针加一,即指向下一位置。最初al指向a[0],循环中随al++依次指向a[1],a[2]...
3) 问题来了,为什么循环终止不确定呢?我们来看看*a1=='\0'何时成立,也即i等于多少时a[i]=='\0'能成立。答案是"不确定",因为我们没有显示地把'\0'放在什么地方,也就是说程序是找着看,找到'\0'就终止循环,找不到就接着找。至于循环次数的变化是与当前堆栈中数据有关。
4) 把 char a[]={'a','b','c'};
改成
char a[]={'a','b','c', '\0'};
试试看。
5) 罗嗦了这么多,其实dubug一下,看看al变化的情况就清楚了。Top
3 楼sxrj()回复于 2003-08-03 02:25:50 得分 0
经过运行,您说的是正确的,不知道各位高手还有没有不同的看法?谢谢了。Top
4 楼williamVII(spread)回复于 2003-08-04 14:03:34 得分 0
偶来复习一下古老的C,Top
5 楼FinalInches(无色枫叶)回复于 2003-08-07 23:57:46 得分 1
只要在赋值的时候改为
char a[]="abc";
它会自动在最后加入一个表示结束的符号“\0”!!!Top
6 楼sxrj()回复于 2003-08-10 10:23:22 得分 0
我是一个初学者,我不知道这分可以分给几个人吗,如果不可以大家觉得我应当给谁最合适?
Top
7 楼sxrj()回复于 2003-08-10 19:49:52 得分 0
欢迎讨论。Top




