C语言程序设计题,下面是一道C语言的二级程序题,本人是C语言初学者,这道题我实在是看不明白程序是怎么走

的,还请各位高手帮帮忙,详细的讲解一下,在这里先谢谢了!今天是小年,祝各位节日快乐!
给定程序中,函数fun的功能是:把形参s所指字符串下标为奇数的字符右移到下一个奇数位置,最右边被移出的字符串的字符绕回到第一个奇数位置,下标为偶数的字符不动(注:字符串的长度大于等于2)
#include "stdio.h"
void fun(char * s)
{
int i,n,k;
char c;
n=0;
for(i=0;s[i]!='\0';i++)
n++;
if(n%2==0)
k=n-1;
else
k=n-2;
c=s[k];
for(i=k-2;i>=1;i=i-2)
s[i+2]=s[i];
s[1]=c;
}
void main()
{
char s[80]="abcdefgh";
printf("\nThe original string is:%s\n",s);
fun(s);
printf("\nThe result is:%s\n",s);
}

#include "stdio.h"
void fun(char * s)
{
int i,n,k;
char c;
n=0;
for(i=0;s[i]!='\0';i++) /*如果字符串没有结束,也就是给的字符串没有到结尾就执行循环,一个字符串的末尾会有一个 '\0'的结束标志的*/
n++; /*这个for循环结束后n里面是这个字符串共有多少个字符*/
if(n%2==0) /*如果n对二取余等于0,即字符个数是偶数*/
k=n-1;
else
k=n-2;/*if之后,如果共十个字符,那么k是9,如果9个字符k是7,即最后一个下标是奇数的下标,这是为了把最后一个放到第一位*/
c=s[k]; //临时变量,用于存放最后一个下标为奇数的字符
for(i=k-2;i>=1;i=i-2) //字数下标字符后移2个,不包括最后一位
s[i+2]=s[i];
s[1]=c; //最后一个奇数移到s[1]
}
void main()
{
char s[80]="abcdefgh";
printf("\nThe original string is:%s\n",s);
fun(s);
printf("\nThe result is:%s\n",s);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-01-16
#include "stdio.h"
void fun(char * s)
{
int i,n,k;
char c;
n=0;
for(i=0;s[i]!='\0';i++)
n++; //求字符串s的长度n,其实可以用n=strlen(s);
if(n%2==0)
k=n-1; //当s的长度n为偶数时,移动字符末位置为k=n-1
else
k=n-2; //当s的长度n为奇数时,移动字符末位置为k=n-2
c=s[k]; //保存最后一个移动奇字符
for(i=k-2;i>=1;i=i-2) //从倒数第2个奇字符到最前面第1个奇字符,逐个移动
s[i+2]=s[i];
s[1]=c; //最后一个奇字符移动到最前面
}
第2个回答  2012-01-18
char s[80]="abcdefgh"; //定义数组
fun(s); //传的是数组指针,所以fun函数执行完后s的值就真正的改变了。
fun()函数的执行过程如下:以"abcdefgh"为例

for(i=0;s[i]!='\0';i++)
n++;
//得到n=8

if(n%2==0)
k=n-1;
else
k=n-2;
//判断n是否为偶数,如果是偶数,则将k赋值为n的前一个奇数
//此时k=8-1=7

c=s[k];
//先把最后这个奇数下标的值保存到变量c中
//c=h

for(i=k-2;i>=1;i=i-2)
s[i+2]=s[i];
//开始执行循环体
//i=7-2=5;i满足>=1执行s[5+2]=s[5],即s[7]=s[5]
//此时s="abcdefgf"
//执行i=i-2即i=5-2=3;i满足>=1执行s[3+2]=s[3],即s[5]=s[3]
//此时s="abcdedgf"
//执行i=i-2即i=3-2=1;i满足>=1执行s[1+2]=s[1],即s[3]=s[1]
//此时s="abcbedgf"
//执行i=i-2即i=1-2=-1;i不满足>=1则跳出循环体

s[1]=c;
//将s[1]的值赋值为h
//此时s="ahcbedgf"
//最后返回此s
第3个回答  2012-01-18
int i,n,k;
char c;
n=0;
for(i=0;s[i]!='\0';i++)/*判断s[i]中的数据是否为0,
n++; 如果不为0,即为字符,所以用n存放字符个数*/
if(n%2==0) /*判断n是否偶数,
k=n-1; /* 是偶数,则n-1=k,而k则是字符串中最右边的奇数下标值,也是上限值*/
else /*不是偶数,即为奇数,
k=n-2; /*则n-2=k,而k则是字符串中最右边的奇数下标值,n-1是字符串的上限值*/
c=s[k]; /*用c存储最右边的奇数下标值存储单元中的数据*/
for(i=k-2;i>=1;i=i-2) /*下标为奇数的字符
s[i+2]=s[i]; 右移到下一个奇数位置
s[1]=c;/*将最右边被移出的字符串的字符绕回到第一个奇数位置*/
相似回答