鱼C论坛

 找回密码
 立即注册
查看: 1244|回复: 9

[已解决]请问可以详细讲解一下这个程序吗

[复制链接]
发表于 2020-9-4 20:43:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
20200904_203429.jpg
最佳答案
2020-9-7 01:41:13
本帖最后由 风过无痕1989 于 2020-9-7 13:16 编辑
永恒的蓝色梦想 发表于 2020-9-6 19:48
仔细核对一下代码,亲
第8行抄错了


看走眼了,第8行是抄错了,运行后,答案B是正确的
#include<stdio.h>
#include<string.h>
void f(char *s,char *t)                 // 定义 f 函数,形参是两个指针变量
{
      char k;                                  // 定义一个临时变量 k
      k = *s;                                  // 将接收的第一个实参赋给临时变量 k (原程序下面几行写在一行,为了解释方便,分开成几行了)
      *s = *t;                                // 将接收的第二个实参赋给第一个实参指向的地址
      *t = k;                                  // 将临时变量保存的原第一个实参的值赋给第一个实参指向的地址。至此,就完成了两个实参的互换
      s++;                                     // 将第一个实参指向的地址加 1
      t--;                                       // 将第二个实参指向的地址减法 1
      if(*s)f(s,t);                            // 递归调用 f 函数
}

void main()
{
      char str[10] ="abcdefg",*p;  // 定义一个字符数组并赋值,定义一个字符型指针变量p
      p = str + strlen(str)/2 + 1;    // 用 strlen 计算字符数组的长度,字符的长度是 1,7个字符长度就是7,除 2 就是3.5,自动取整就是 3,于是字符型指针 p 就指向了数组首地址 + 3 + 1,即字符 e
      f(p,p - 2);                             // 将字符型指针指向的地址,及该地址减2,作为函数 f 的两个实参,调用 f 函数
      printf("%s\n",str);                // 输出字符串,即函数返回的数组各元素的值

}

既然楼主至今没有选出最佳答案,想必是没有得到他想要的结果,而我又将抄错了的程序,纠正后重新出来了。现补充程序每一步实现的功能,帮助楼主理解,希望是楼主想的结果了。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-9-4 21:32:43 | 显示全部楼层
本帖最后由 baige 于 2020-9-4 21:57 编辑

先让p指向e,接着调用函数传入c,e的地址实现交换,然后一直向外扩张去交换直到遇到'\0'结束递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-5 01:07:24 | 显示全部楼层
1、strlen(str) 得到 7,因为它计算的结果不包括字符串最后的结束符 '\0'
2、7/2 得到 3,因为是整型;数组名 str 代表首元素地址,str + 4 表示 str[4],即字符 'e'
3、f (p, p - 2) 表示将 str[4] 和 str[2] 的地址传入 f 函数
4、将 str[4] 和 str[2] 进行交换 ,得到 str[0] str[1] str[4] str[3] str[2] str[5] str[6] str[7] 的排序
5、s++ 使 s 指向 str[5] ;同理 t-- 使 t 指向 str[1]
6、递归,交换 str[5] 和 str[1], 得到 str[0] str[5] str[4] str[3] str[2] str[1] str[6] str[7]
7、继续递归,交换 str[6] 和 str[0] ,得到 str[6] str[5] str[4] str[3] str[2] str[1] str[0] str[7]
8、s 指向 str[7] 时,即指向结束符 '\0' ,结束递归,此时得到的数组,其元素排序和原来的相反,所以...

大概是这样的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-5 08:35:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-5 08:36:57 | 显示全部楼层

回帖奖励 +3 鱼币

str[4] 和 str[2] 进行交换 ,得 str[0] str[1] str[4] str[3] str[2] str[5] str[6] str[7] 的排序 s++ 使 s 指向 str[5] ;同理 t-- 使 t 指向 str[1]递归,交换 str[5] 和 str[1], 得到 str[0] str[5] str[4] str[3] str[2] str[1] str[6] str[7]继续递归,交换 str[6] 和 str[0] ,得到 str[6] str[5] str[4] str[3] str[2] str[1] str[0] str[7]s 指向 str[7] 时,即指向结束符 '\0' ,结束递归,此时得到的数组,元素排序和原来的相反。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-5 09:42:17 | 显示全部楼层

回帖奖励 +3 鱼币

本帖最后由 风过无痕1989 于 2020-9-5 09:45 编辑

该程序运行的结果,D是正确的!
#include<stdio.h>
#include<string.h>
void f(char *s,char *t)
{
        char k;
        k = *s;*s = *t;*t = k;
        s++;t--;
        if(*s)(f,t);
}

void main()
{
        char str[10] ="abcdefg",*p;
        p = str + strlen(str)/2 + 1;
        f(p,p - 2);
    printf("%s\n",str);

}

str.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-6 19:48:32 | 显示全部楼层
风过无痕1989 发表于 2020-9-5 09:42
该程序运行的结果,D是正确的!


仔细核对一下代码,亲
第8行抄错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 01:41:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-9-7 13:16 编辑
永恒的蓝色梦想 发表于 2020-9-6 19:48
仔细核对一下代码,亲
第8行抄错了


看走眼了,第8行是抄错了,运行后,答案B是正确的
#include<stdio.h>
#include<string.h>
void f(char *s,char *t)                 // 定义 f 函数,形参是两个指针变量
{
      char k;                                  // 定义一个临时变量 k
      k = *s;                                  // 将接收的第一个实参赋给临时变量 k (原程序下面几行写在一行,为了解释方便,分开成几行了)
      *s = *t;                                // 将接收的第二个实参赋给第一个实参指向的地址
      *t = k;                                  // 将临时变量保存的原第一个实参的值赋给第一个实参指向的地址。至此,就完成了两个实参的互换
      s++;                                     // 将第一个实参指向的地址加 1
      t--;                                       // 将第二个实参指向的地址减法 1
      if(*s)f(s,t);                            // 递归调用 f 函数
}

void main()
{
      char str[10] ="abcdefg",*p;  // 定义一个字符数组并赋值,定义一个字符型指针变量p
      p = str + strlen(str)/2 + 1;    // 用 strlen 计算字符数组的长度,字符的长度是 1,7个字符长度就是7,除 2 就是3.5,自动取整就是 3,于是字符型指针 p 就指向了数组首地址 + 3 + 1,即字符 e
      f(p,p - 2);                             // 将字符型指针指向的地址,及该地址减2,作为函数 f 的两个实参,调用 f 函数
      printf("%s\n",str);                // 输出字符串,即函数返回的数组各元素的值

}

既然楼主至今没有选出最佳答案,想必是没有得到他想要的结果,而我又将抄错了的程序,纠正后重新出来了。现补充程序每一步实现的功能,帮助楼主理解,希望是楼主想的结果了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 03:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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