鱼C论坛

 找回密码
 立即注册
查看: 2180|回复: 1

不懂问题,求助,急

[复制链接]
发表于 2014-8-23 09:50:10 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 风之残月 于 2014-11-9 22:42 编辑
#include <stdio.h>
int main()
{
        char a[]="I am a student.",b[20]; //定义字符数组
        int i,j;        
        for (i=sizeof(a)-2,j=0;i>=0;i--,j++)
                *(b+j)=*(a+i);        //将a[i]的值赋给b[j]        
        *(b+j)='\0';                //在b数组的有效字符之后加'\0',做为字符串结束标志
        printf("string a is:%s\n",a);
        printf("string b is:%s\n",b);
        return 0;
}
不理解for (i=sizeof(a)-2,j=0;i>=0;i--,j++)这句话

最佳答案

查看完整内容

sizeof(a)取到a数组的长度。 单位为字节。 你可以数一数I am a student.包括空格和标点符号。一共是15个。共15个字节。然而由于char 数组你定义的时候char a[]而不是char a[15]。所以自动分配大小。默认为15+1=16(这个+1的空间用来存放字符串结尾\0)。 所以i=sizeof(a)-2=16-2=14 若你写成char a[15]这时候i=sizeof(a)-2=15-2=13(当然你这样写代码运行是会出问题的) 至于为什么-2 上面说到i=14。 i a m a s t u d e n t ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-23 09:50:11 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2014-8-23 10:50 编辑

sizeof(a)取到a数组的长度。
单位为字节。
你可以数一数I am a student.包括空格和标点符号。一共是15个。共15个字节。然而由于char 数组你定义的时候char a[]而不是char a[15]。所以自动分配大小。默认为15+1=16(这个+1的空间用来存放字符串结尾\0)。
所以i=sizeof(a)-2=16-2=14
若你写成char a[15]这时候i=sizeof(a)-2=15-2=13(当然你这样写代码运行是会出问题的)
至于为什么-2
上面说到i=14。
i a m a s t u d e n t . 这些字符包括空格共15个分别对应的数组下标为
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
若不减2
则循环会多出两个下标
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16这就越界了

对了,忘记说整体语句的作用了
for (i=sizeof(a)-2,j=0;i>=0;i--,j++)
第一次循环的时候i=14,j=0
*(b+j)=*(a+i);
也就是
b[j]= a[i];
(你完全可以把上面那个改成下面这个)
[i][i][i]
在第一次循环的时候就是 b[0]=a[14]。用中文描述就是b数组的第一个字符赋值为a数组的最后一个字符
在第二次循环的会后就是 b[1]=a[13]。用中文描述就是b数组的第二个字符赋值为a数组的倒数第二个字符

以此类推就是把a数组的内容倒放到b数组,也就是倒序排放。


[/i][/i][/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表