扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
逆序输出有很多种,具体的实现方法取决于你题目的要求
创新互联公司是一家业务范围包括IDC托管业务,虚拟主机、主机租用、主机托管,四川、重庆、广东电信服务器租用,服务器托管,成都网通服务器托管,成都服务器租用,业务范围遍及中国大陆、港澳台以及欧美等多个国家及地区的互联网数据服务公司。
1. 如果只是要求逆序输出,那么可以采用类似的方法:
void reverse(char *s)
{
if(*s=='\0')
return;
reverse(s+1);
printf("%c",*s);
}
这种方法在s很长的情况下会一直递归到底,不是很好。
2. 如果需要将字符串整个逆序在函数外面输出,那么可能希望采用返回字符串指针的方式;实现如下:
char * reverse( char* s )
{
static char *p = s+strlen(s)-1; //p是一个静态变量,指向当前递归层处理的字符串尾,而s指向字符串头
if(s p)
{
char c = *p; //交换头尾字符
*p = *s;
*s = c;
p--; //尾向前挪一个
reverse(s+1); //相当于头向后挪一个
}
return s;
}
3.1 当然,有的时候,并不需要reverse函数本身递归,而是可以借助一些辅助的递归函数,比如说:
void reversehelp(char * head, char * end)
{
if (head end)
{
char c = *head;
*head = *end;
*end = c;
reversehelp(++head, --end);
}
}
然后在调用时像这样调用:
char * reverse(char * s)
{
char * end = s + strlen(s) - 1;
reversehelp(s, end);
return s;
}
3.2 类似的辅助函数还可以采用一个字符串指针和一个长度参数的方式,如下例:
void reversehelp( char* s, int n )
{
if ( n 1 )
{
char c = s[n-1];
s[n-1] = s[0];
s[0] = c;
reversehelp( s+1, n-2 );
}
}
然后在调用时如下:
char *reverse(char *s)
{
reversehelp( s, strlen(s) );
return s;
}
代码里有一些问题,看注释。
#includestdio.h
int nixu (int n,int a[]);
void main()
{
int a[10],i;
printf("please input 10 numbers\n");
for(i=0; i10; i++)
scanf("%d",a[i]); /*数组10个元素,最大下标只能到9,a[10]越界;另外a[i]才是需要输入的元素,而不是恒定某一个元素*/
nixu (10, a);
for(i=0; i10; i++) /*输出数组同样也要循环*/
printf("%d ",a[i]); /*数组10个元素,最大下标只能到9,a[10]越界*/
}
int nixu (int n, int a[]) /*函数定义参数不能和局部变量重名*/
{
int i,k=(n-1)/2,t; /*运算符/比-优先级高,要加括号*/
for(i=0; i=k; i++)
{ /*逆序过程只要一重循环就可以了*/
t=a[i];
a[i]=a[n-i-1]; /*尾部对应的数组下标要找对*/
a[n-i-1]=t;
}
return 0; /*返回随便一个值就可以,调用的地方不需要函数返回值,不能返回数组首地址*/
}
你的go 函数 里有 return k; 在最后的pfintf里执行完go函数的时候 k=-1(跳出循环执行return k;)被输出 了。
#includestdio.h
#define N 8
int go(char a[]){
int k;
for(k=N-1;k=0;k--){
printf("%2d",a[k]);
}
return k;
}
main(){
char b[]={3,2,5,1,7,4,9,0};
go(b);
}
改成这样就可以了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流