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.

C语言程序求分析,最好每行都详细说明下,尤其是中间2行for循环读着很乱...
1.双重循环对for语句在表达式括号后面不要加;(分号,能看见吧?),你加了分号意味着for不做任何动作,这是合法但是毫无意义的。所以你的程序只是执行了*q=*p;*q=‘\\0';printf三句,而str2根本未初始化!那么打印出来的东西是未知的或者是空。2.解决了上述问题之后,编译执行你发现输出窗口黑色的...

关于C语言,本题为什么for循环用了两次呢,求详解 都是什么情况下for循环...
我们来分析一下:首先,要做到这些是就必须遍历数组中的每一个元素,因此循环是必须的,而且对于这种循环次数已知的问题(数组元素数为9),我们一般会用for循环 其次,在设计程序的时候我们应遵守一项原则,尽量少地使用for循环的个数,尤其最好能避免for循环的嵌套问题(这道题显然不需要)。因此,我们...

高手们帮我看看c语言程序,请给每行代码和功能注释
先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序. 二.学好C语言的四种程序结构 (1)顺序结构 顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的...

C语言程序分析,输入一个数,确定是几位数,输出每一位和按逆序输出每一...
int len) \/\/从首位查找非0字符,并且返回非0首地址{ if(p[0] == '0')\/\/如果输入的字符串首位没有0则不运行下面的算法直接跳过 { for(int i=0;i<len;i++) { if((p[i] == '0') && (p[i+1] != '0')) { return &p[i+1]; } } } ...

c语言2道选择题求解!最好复解析,方便理解!~
1选D i从3变化到1,j从1变化到2,所以结果是3行,每行2个数字,所以,A、B都不对。输出是i+j,所以每行第一个数字是从大到小,每行第二个数字比第一个数字大1.所以C是错的 2选B I=1,输出第一行,i=2是输出第二行 所以 c是错的 j是从i开始,所以第一行第一个应该是1*1 ......

C语言问题
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\\n"); for(i=1;i<5;i++) \/*以下为三重循环*\/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) \/*...

初学者怎样看懂代码?
初学者要看懂代码首先从要需求分析了解,然后是系统分析,最后是块的理解。看懂代码其实不难,大抵不过是选择,分支,循环。语法如果看不懂,那就需要补补基础,先弄清楚这段代码要做什么,有说明最好,可以帮助理解,没有说明就试着过一下代码流程。

自学c语言 零基础 看什么书 该怎么学
《《啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书》.zip》百度网盘资源免费下载 链接:https:\/\/pan.baidu.com\/s\/1aEXrb1oxnRmMWUlafELpfQ 提取码:pusr啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书

运用C语言知识,编制和调试程序,有如下功能:
一、需求分析:1、程序的输入:只需按系统提示输入整型数字或英文字母即可。每次数据的输入均以回车符作为结束标志。2、程序的输出:每一项数据输出均有汉字的提示,输出格式均为整型或字符串。3、程序的系统功能:(1)、图书库系统管理;(2)、借阅者信息的管理;(3)、日常借书还书操作;(4)、根据...

用C语言编写可以进行加减乘除整数运算混合运算的计算器,要求写思路,越...
三.需求分析 该程序实现的是实数型的四则运算,并在此运算上又加入了幂”^”运算,该程序用一二叉树表示整个输入的算术表达式: (1)实现对结点的打印,便于结果分析; (2)实现对结点的统计; (3)实现中间结果的显示,可以看打印的结点,验证运算结果的正确与否。 四.概要设计 系统用到的抽象数据类型定义: 1.ADT no...

相似回答