c语言 for(i=strlen(s)-1;i>=0;i--) print("%c",*(s+i)); 怎么看不懂

exchange(char*p,int b)十进制转十六进制
{int j;
while(b>0)
{j=b%16;
if(j<10)*p=j+48;每位上的数加上48转换成数字字符,ASCII值048表示0
else*p=j+55;若数大于等于10则转换为字母字符,j+55转到的字符是字母即16进制中的ABCDEF
b=b/16;p++;
}
*p='\0';
}
main( )
{int a=21,i;
char s[40];
exchange(s,a);
for(i=strlen(s)-1;i>=0;i--)
print("%c",*(s+i));
}
程序结果是:

这其实算简单了,还没说直接给你一个int让你自己写函数2、8、16、十进制之间互相转换。

其实这里是这样的。。。将b不断的对16取模,然后余数根据十六进制的法则变为对应的ASCLL码,这段你没有问相信你也会了,关键就在于换算成对应的ASCII之后,将结果存放在数组s中,而且每次是按位存储的,所以也有一个指针p在里面控制数组,这里你简单理解成结果按位存储在字符串数组s中,数组中每一位都是一个ASCII码。

for(i=strlen(s)-1;i>=0;i--)
print("%c",*(s+i));

这段的意思就是将数组打印出来。

估计你没转过弯来可能就是字符数组其实可以用字符串求长度的函数strlen来求出字符数组的长度,换个角度理解,你也可以看成连续的字符数组串联起来其实就是一个字符串嘛。。

由于按位存放结果。。。所以要从后往前输出,,其实举个很简单的道理,随便给你一个两位数让你分析出十位和个位,按照上面算法的尿性,比方说23/10商等于2余3,上面的算法是先放进去低位再放进去高位,而人阅读是从高位向低位阅读,因此,要倒着来输出。

不知道这样说你明不明白。。

其实再白纸上画出几个格子,或者打开excel演算一下就明白了。。。把每一个格子当成是字符串数组的内存的话。。。追问

关键是exchange(char*p,int b)函数,里面有char*p,具体是怎样执行下面exchange(s,a);语句的嘛?

追答

其实你可以去翻翻书,这其实是比较容易忽略的,老师不怎么重点讲的一个知识点。其实就一句话:数组名也是一个指针。
正如你所说的exchange(char*p,int b),里面有一个char类型的指针p,而s是数组,为什么能exchange(s,a);这样调用,其实,C语言规定,简单来说,如果只写数组名s,则s其实就是指向数组第一个元素的指针,其实,如果学过数据结构,老师会说,其实C语言这种数组,在内存空间中是以连续的内存地址存放的,也就是说这个数组中的每一个元素的地址都是相邻的,所以,只需要知道第一个,要找后面的元素就易如反掌了,因此,c语言规定数组名s其实可以看成是一个指向摆放这堆数字的第一个元素的指针,简单来说就是s可以看成是一个指针,指向数组的第一个元素。所以,既然是指针,那么我把这个指针地址传给函数的参数p,p也就拿到了这个数组第一个元素的地址,换言之,我有了第一个元素的地址,要找后面的元素还难么?
具体函数里面的操作就是将传入的数组不断除以16取模,然后转换成ASCII码存放在字符数组中,最后再告诉系统这是ASCII码,以ASCII码为基础显示出来。

其实这种数组叫做顺序存储,好处是查找读取速度快,但是插入元素比较耗时间,而且要占用连续一段内存,内存可能有机会不够连续控件存储,有可能存不了。。。因此有了链式存储。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-02
for(i=strlen(s)-1;i>=0;i--), i的值从s字串的长度减1递减到0,依次打印s[i]的值。

函数exchange中把十进制转换到16进制数到s中,其顺序是反的,所以,输出时循环也反过来输出。追问

关键是exchange(char*p,int b)函数,里面有char*p,具体是怎样执行下面exchange(s,a);语句的嘛?

追答

exchange(char*p,int b)这是定义中的写法, p和b都是形参,

当调用这个函数时,exchange(s,a),则用s来代替p, 用a来代替b

相当于在函数exchange(char *p=s,int b=a)中,p的值是s, b的值是a,

本回答被网友采纳

c语言 for(i=strlen(s)-1;i>=0;i--) print("%c",*(s+i)); 怎么看不懂...
for(i=strlen(s)-1;i>=0;i--)print("%c",*(s+i));这段的意思就是将数组打印出来。估计你没转过弯来可能就是字符数组其实可以用字符串求长度的函数strlen来求出字符数组的长度,换个角度理解,你也可以看成连续的字符数组串联起来其实就是一个字符串嘛。。由于按位存放结果。。。所以要...

for(i=strlen(s)-1;i>=0;i--,t<<=1)是什么意思?
for(i=strlen(s)-1;i>=0;i--,t<<=1)这个循环的目的是求出二进制字符串的值 其中i=strlen(s)-1;是循环的起点,即从字符串的最右侧开始处理。i>=0;是循环的终点,即处理完最左侧字符串结束循环 i--,t<<=1 \/\/i--是保障逐个字符处理 ,t<<=1是获得每个二进制串中每位的权值,...

C语言编程,写一个函数,使输入的一个字符串按反序存放,在主函数中输入和...
void printit(char *str,int length) \/\/返序输出函数 { int i;for(i=length-1;i>=0;i--) \/\/从给定的字符串的最后一位依次向前遍历各字符 putchar(*(str+i)); \/\/每向前一个字符即打印该字符,直至第一个字符为止。} int main(){ char str[80]=""; \/\/定义一个长度...

for(i-=1;i>=0;i--) 问这个语句中 i-=1,是什么意思 为什么有-,而且是...
i-=1就是i=i-1的简便写法,还可以更简便i--或者--i。

c++ 中如何反向输出一个字符串
如果仅用于输出,最简单的方法,就是循环输出每个字符,从最后一个开始,到第一个结束。如字符串变量为s,其长度为l,可以 for(int i = l -1; i >=0; i --)cout <<str[i];这样就可以实现反向输出了。这种方式,对于字符数组(char[]或char *)形式的字符串,及string类字符串均有效。

C语言 输入一个整数,如何输出它的逆续数,比如12345,要求输出54321
求它的各位数字,分别输出即可,比如12345:12345%10求出个位数字5,输出;12345\/10得1234,1234%10求出十位数字4,输出;1234\/10得123,再求下去,不断重复即可求出各位数字。

c语言去掉字符串的空格函数trim
c语言去掉字符串的空格函数 void trim(char *s){} 如下:include <stdio.h> void trim(char *s){ int i,L;L=strlen(s);for (i=L-1;i>=0;i--) if (s[i]==' ')strcpy(s+i,s+i+1);} int main(){ char s[100];printf("input 1 line string\\n");gets(s);trim(s);p...

输入一个数,反向输出,C语言程序
include<stdio.h> include<string.h> int main(void){ char word[20];int i;printf("Please input a word:");scanf("%s",&word);for(i=strlen(word)-1;i>=0;i--)printf("%c",word[i]);printf("\\n");return(0);} 调试过了。可以哦 ...

请求好心~~C语言高手帮忙编写下~~~谢谢~
{ int a=1,b=0,c=0,i; for (i=strlen(ch)-1;i>=0;i--) { if (ch[i]<58&&ch[i]>47) { b=a*(ch[i]-48); a=a*10; c=c+b; } else { PR("%c 不合法,无法将此字符串转化为整形!\\n",ch[i]); return 0; } \/\/ printf("the c is %d\\n",c); } return c; } ...

求<c语言程序设计>的答案
printA(a); reverse(a); \/\/函数转置 printf("转置后的数组:\\n"); printA(a);}void printA(int a[3][3]){ int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("%6d",a[i][j]); } printf("\\n"); }}void reverse(int a[3][3]) \/\/函数转置的定义{ int i,j,t...

相似回答