一道c语言题,希望大神详细讲解。
2014-02-22
首先我想问LZ:为什么要伤害我的脖子?
然后我想说,出这个题目的老师可以拖出去揍一顿。代码写得这么丑,puts()还错写成put()。
接下来是代码的解释:
<代码>char * s, c[80];
<说明>声明一个char指针s,一个长80char单位的字符数组c
<代码>s = c;
<说明>把字符数组c的首地址赋给指针s,即s = &(c[0])
<代码>gets(s);
<说明>程序运行到gets(s);等待输入
<用户操作>用户输入apple
<说明>
c[0] = 'a'
c[1] = 'p'
c[2] = 'p'
c[3] = 'l'
c[4] = 'e'
c[5] = '\0'
<代码>while(*(++s) != '\0')
<说明>
因为++s : s = &(c[1])
所以*(++s) != '\0'
*(&c[1]) != '\0'
c[1] != '\0'
'a' != '\0'
所以 (*(++s) != '\0') == 1
循环条件成立,执行循环
<代码>
if (*s == 'a')
{
break;
}
else
{
s++;
gets(s);
}
<说明>
如果*s == 'a'跳出while循环,否则s++,get(s)。
此处*s 等于c[1],即'p'。
条件不成立,执行s++,get(s),s = &(c[2])。
<用户操作>用户输入cat
c[2] = 'c'
c[3] = 'a'
c[4] = 't'
c[5] = '\0'
此时程序回到循环开头判断循环条件是否成立
(此处循环代码,重复的,就不写了)
循环里的++s使 s = &(c[3])
*s 等于c[3] 等于 'a',不等于'\0'
循环条件成立,继续循环。
*s等于c[3] 等于 'a'。
跳出循环。
puts(s)
从s(c[3])处开始输出字符,在'\0'(c[5])处停止
所以就是输出'a''t''\n'
写代码不要学这种写法,自己去网上查查规范,这个程序至少要写成这个样子:
#include <stdio.h>
int main()
{
char * s;
char c[80];
s = c;
gets(s);
while ( *(++s) != '\0' )
{
if (*s == 'a' )
{
break;
}
else
{
s++;
gets(s);
}
}
puts(s);
return 0;
}
很清晰,很详细,很感谢。不过我很愚钝,输入cat时为什么是c[2]='c'而不是c[0]='c'
纠正一下,cat时是c[3]='c'
因为是gets(s),而不是gets(c),输入cat时,指针s的地址在循环中经过三次自加后,等于&(c[3]);