鱼C论坛

 找回密码
 立即注册
查看: 1759|回复: 20

[已解决]C语言作业题!大神帮帮我,不想挂科55555

[复制链接]
发表于 2020-12-21 11:28:21 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 肚子饿了233 于 2020-12-21 19:09 编辑

#include<string.h>
#include<stdio.h>
void f(char*s,char*t)
{char k;
k=*s;
*s=*t;
*t=k;

s++;t--;

if(*s);f(s,t);
}
main()
{char str[10]="abcdefg",*p;
p=str+strlen(str)/2+1;
f(p,p-2);
printf("%s\n",str);
}
不懂这个p=str+strlen(str)/2+1;代表啥意思?p现在指向了谁?
希望哪位大神看见了能指出详细的解题过程!!!
(小女子QQ:1272804295)
最佳答案
2020-12-22 11:02:05
本帖最后由 风过无痕1989 于 2020-12-22 16:02 编辑
肚子饿了233 发表于 2020-12-21 19:20
刚刚加了一行#include发现可以运行了,但我目前的问题是不知道后面应该怎样运行了,不知道最后的运行结果 ...


昨晚冬至哈,出去玩了,没见你的回复,今天又见你发帖子了,不好意思哈~~
#include<string.h>
#include<stdio.h>
void f(char*s, char*t)
{
        char k;                         // 定义一个临时变量
        k = *s;                         // 将接收到p 的地址的值赋给k 
        *s = *t;                        // 将接收到p-2的地址的值赋给*s
        *t = k;                         // 将临时变量保存的地址的值赋给*t,完成p、p-2的地址交换
        s++;
        t--;
        if (*s)                         // 此个多了一个分号,导致无输出的错误
        f(s, t);                        // 以*s不为结束标志'\0'为条件,递归调用函数
}

int main()
{
        char str[10] = "abcdefg", *p;
        p = str + strlen(str) / 2 + 1;   // 定义指针,p指向字符e,p - 2 指向字符c
        f(p, p - 2);                     // 以 p, p - 2为实参,调用函数
        printf("%s\n", str);             // 输出字符数组
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-21 11:49:05 | 显示全部楼层
str在这个式子中指的是str数组的首地址,也就是str[0]的地址,strlen(str)/2+1 = 7 / 2 + 1= 4
str+4 = str[0] + 4 = str[3]的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 12:04:41 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-21 12:05 编辑

        strlen(str) = 7,所以:
str + strlen(str) / 2 + 1 = & str[4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 12:13:16 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-12-21 12:04
strlen(str) = 7,所以:

那后面的程序是咋进行的呢?最终结果是多少,大神可否详细指点?谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 13:26:55 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-12-21 13:29 编辑

p = str + strlen(str) / 2 + 1 指向的是第 5 个字符 e,p - 2 指向的是第 3 个字符 c
程序缺少 #include<stdio.h> ,printf() 函数出错;
即使是添加了头函数,程序也没有输出结果,错误出在递归那里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 19:10:58 | 显示全部楼层
_Yun 发表于 2020-12-21 11:49
str在这个式子中指的是str数组的首地址,也就是str[0]的地址,strlen(str)/2+1 = 7 / 2 + 1= 4
str+4 = st ...

不对哟,应该指向的是str[4]的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 19:15:18 | 显示全部楼层
jackz007 发表于 2020-12-21 12:04
strlen(str) = 7,所以:

大神,我的问题更新了,不要不理我呀5555555
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 19:20:46 | 显示全部楼层
风过无痕1989 发表于 2020-12-21 13:26
p = str + strlen(str) / 2 + 1 指向的是第 5 个字符 e,p - 2 指向的是第 3 个字符 c
程序缺少 #include  ...

刚刚加了一行#include<stdio.h>发现可以运行了,但我目前的问题是不知道后面应该怎样运行了,不知道最后的运行结果是怎样得出来的?还希望大神多多指点呀!小女子将感激不尽!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 11:02:05 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-12-22 16:02 编辑
肚子饿了233 发表于 2020-12-21 19:20
刚刚加了一行#include发现可以运行了,但我目前的问题是不知道后面应该怎样运行了,不知道最后的运行结果 ...


昨晚冬至哈,出去玩了,没见你的回复,今天又见你发帖子了,不好意思哈~~
#include<string.h>
#include<stdio.h>
void f(char*s, char*t)
{
        char k;                         // 定义一个临时变量
        k = *s;                         // 将接收到p 的地址的值赋给k 
        *s = *t;                        // 将接收到p-2的地址的值赋给*s
        *t = k;                         // 将临时变量保存的地址的值赋给*t,完成p、p-2的地址交换
        s++;
        t--;
        if (*s)                         // 此个多了一个分号,导致无输出的错误
        f(s, t);                        // 以*s不为结束标志'\0'为条件,递归调用函数
}

int main()
{
        char str[10] = "abcdefg", *p;
        p = str + strlen(str) / 2 + 1;   // 定义指针,p指向字符e,p - 2 指向字符c
        f(p, p - 2);                     // 以 p, p - 2为实参,调用函数
        printf("%s\n", str);             // 输出字符数组
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 12:09:34 | 显示全部楼层
风过无痕1989 发表于 2020-12-22 11:02
昨晚冬至哈,出去玩了,没见你的回复,今天又见你发帖子了,不好意思哈~~

谢谢大神!我还有最后一个疑问,就是程序运行的最终结果为gfedcba,可是我觉得应该是gfcdeba,也就是这个c和e的位置我觉得应该为先c 后e,因为这两个字母被交换了两次,第一次交换为e,c,后来进行了第二次交换就变为c,e了呀?为啥我这样想是错误的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 12:37:49 | 显示全部楼层
肚子饿了233 发表于 2020-12-22 12:09
谢谢大神!我还有最后一个疑问,就是程序运行的最终结果为gfedcba,可是我觉得应该是gfcdeba,也就是这个c ...

p, p - 2 分别指向 e、c,调用递归函数,之中只调换了一次,没有两次,我录个视频给你看运行过程,看发不发得上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-22 12:43:05 | 显示全部楼层
风过无痕1989 发表于 2020-12-22 12:37
p, p - 2 分别指向 e、c,调用递归函数,之中只调换了一次,没有两次,我录个视频给你看运行过程,看发不 ...

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

使用道具 举报

发表于 2020-12-22 13:23:40 | 显示全部楼层

视频发不上来,我重新一步一步运行,然后截图,做个动画发上来吧。只是要点时间,我发上来了再通知你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 14:39:15 | 显示全部楼层

动画简略地做了一下,因为怕超过 2M,发不上来,作了次优化,可能会导致个别图片发虚,看不清楚,你凑合着看看,知道程序是怎么运行的这个意思就行了
exchange.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 16:54:14 | 显示全部楼层
风过无痕1989 发表于 2020-12-22 14:39
动画简略地做了一下,因为怕超过 2M,发不上来,作了次优化,可能会导致个别图片发虚,看不清楚,你凑合 ...

真的是辛苦大神了!太谢谢你一直帮助我这个小菜鸟,虽然我不是很懂汇编语言,但我好像明白了我的知识漏铜所在。
char k;  k=*s//将接收到的地址赋给k// 这个地方,k是一个字符型,不应该理解为将一个字符赋给k吗?为啥是地址呢?还有这个被调函数完成是地址交换呀?我一直理解的都是交换的值,*s,*t不是取值的意思吗?
我感觉自己好迷糊呀~今天还有程序设计考试55555
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 17:37:00 | 显示全部楼层
肚子饿了233 发表于 2020-12-22 16:54
真的是辛苦大神了!太谢谢你一直帮助我这个小菜鸟,虽然我不是很懂汇编语言,但我好像明白了我的知识漏铜 ...

s 是地址,*s 是取这个地址的值,然后赋给变量 k

我上面那个动画可不是汇编语言哟,那是C程序的调试过程,叫做步进跟踪调试。调试程序是每一个程序学习者都必须要会的能力!因为程序不是写出来的,是通过不断地调试出来的(这是小甲鱼老师在视频里讲了好几次的原话。或许你没有看过这些视频,但程序确实是一步一步调试出来的!)

也正是因为如此,我对网上每一个程序都必须经过调试后,才发出来给求助者。这也就是在很多的时候,我回答求助的者时间比别人晚了很多的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-22 17:54:35 | 显示全部楼层
风过无痕1989 发表于 2020-12-22 17:37
s 是地址,*s 是取这个地址的值,然后赋给变量 k

我上面那个动画可不是汇编语言哟,那是C程序的调试过 ...

大神,我用的编译器是Dev-C++;跟小甲鱼老师用的编译器不一样,自己也不会调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 18:00:52 | 显示全部楼层
肚子饿了233 发表于 2020-12-22 17:54
大神,我用的编译器是Dev-C++;跟小甲鱼老师用的编译器不一样,自己也不会调试

DEV_C++我电脑里也安装有,主要用于有些 程序使用了变长数组。DEV_C++ 的调试,我也看过不少视频和教程,至今仍然不会。所以,一开始我是使用 VC++6.0,现在我新购一块硬盘,安装了 VS2015
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 19:00:45 | 显示全部楼层
风过无痕1989 发表于 2020-12-22 18:00
DEV_C++我电脑里也安装有,主要用于有些 程序使用了变长数组。DEV_C++ 的调试,我也看过不少视频和教程, ...

大神,我的联想商店里只有vs2017,你用过这个吗?因为我是新手,对于不同软件也不是很了解,如果这个适合我的话,那我就下载啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 19:10:16 | 显示全部楼层
肚子饿了233 发表于 2020-12-22 19:00
大神,我的联想商店里只有vs2017,你用过这个吗?因为我是新手,对于不同软件也不是很了解,如果这个适合 ...

应该是差不多的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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