C语言程序求分析,最好每行都详细说明下,尤其是中间2行for循环读着很乱

{ char str1[]="good morning!", str2[20];
char *p, *q;
for(p=str1;*p !='\0';p++);
for(q=str2; --p>=str1;q++); *q=*p;
*q='\0';
printf("%s",str2);
}
麻烦详细解释下结果是怎么得出来的

首先我猜你想打印"gninrom doog"。
这个程序出现了不止一处错误,下面逐个指出:
1.双重循环对for语句在表达式括号后面不要加;(分号,能看见吧?),你加了分号意味着for不做任何动作,这是合法但是毫无意义的。
所以你的程序只是执行了*q=*p;*q=‘\0';printf三句,而str2根本未初始化!那么打印出来的东西是未知的或者是空。
2.解决了上述问题之后,编译执行你发现输出窗口黑色的,光标在左上角闪,没有一个输出,而且程序无法自己结束。
呵呵,很明显,你的程序陷入死循环中。
原因很简单,就是你在外层循环的循环体(就是第二个循环里)改变了循环变量P。
你自己模拟一下就ok了。
反正最终的结果是P始终被赋值str1。
这里反映出编程的一个坏习惯,那就是在循环体中改变循环变量的值。这个错误常常是致命的。
正确的代码如下:
#include <stdio.h>
void main()
{
char str1[]="good morning!",str2[20];
char *p,*q,*temp;

for (p=str1;*p!='\0';p++)
{
temp=p;
for(q=str2;--temp>=str1;q++)
*q=*temp;
}
*q='\0';
printf("%s",str2);
}
输出结果:
gninrom doog
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-10
char str1[]="good morning!", str2[20];定义一个字符数组,并赋值;
char *p, *q;定义两个取地址符; for(p=str1;*p !='\0';p++);求解表达式一,在判断表达式二,若为真,则p++,第二个for同理。再把*p复制给*q.
相似回答