肚子饿了233 发表于 2020-12-21 11:28:21

C语言作业题!大神帮帮我,不想挂科55555

本帖最后由 肚子饿了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="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)

_Yun 发表于 2020-12-21 11:49:05

str在这个式子中指的是str数组的首地址,也就是str的地址,strlen(str)/2+1 = 7 / 2 + 1= 4
str+4 = str + 4 = str的地址

jackz007 发表于 2020-12-21 12:04:41

本帖最后由 jackz007 于 2020-12-21 12:05 编辑

      strlen(str) = 7,所以:
str + strlen(str) / 2 + 1 = & str

肚子饿了233 发表于 2020-12-21 12:13:16

jackz007 发表于 2020-12-21 12:04
strlen(str) = 7,所以:

那后面的程序是咋进行的呢?最终结果是多少,大神可否详细指点?谢谢了

风过无痕1989 发表于 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() 函数出错;
即使是添加了头函数,程序也没有输出结果,错误出在递归那里

肚子饿了233 发表于 2020-12-21 19:10:58

_Yun 发表于 2020-12-21 11:49
str在这个式子中指的是str数组的首地址,也就是str的地址,strlen(str)/2+1 = 7 / 2 + 1= 4
str+4 = st ...

不对哟,应该指向的是str的地址

肚子饿了233 发表于 2020-12-21 19:15:18

jackz007 发表于 2020-12-21 12:04
strlen(str) = 7,所以:

大神,我的问题更新了,不要不理我呀5555555

肚子饿了233 发表于 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>发现可以运行了,但我目前的问题是不知道后面应该怎样运行了,不知道最后的运行结果是怎样得出来的?还希望大神多多指点呀!小女子将感激不尽!!!

风过无痕1989 发表于 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 = "abcdefg", *p;
      p = str + strlen(str) / 2 + 1;   // 定义指针,p指向字符e,p - 2 指向字符c
      f(p, p - 2);                     // 以 p, p - 2为实参,调用函数
      printf("%s\n", str);             // 输出字符数组
}

肚子饿了233 发表于 2020-12-22 12:09:34

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

谢谢大神!我还有最后一个疑问,就是程序运行的最终结果为gfedcba,可是我觉得应该是gfcdeba,也就是这个c和e的位置我觉得应该为先c 后e,因为这两个字母被交换了两次,第一次交换为e,c,后来进行了第二次交换就变为c,e了呀?为啥我这样想是错误的呢?

风过无痕1989 发表于 2020-12-22 12:37:49

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

p, p - 2 分别指向 e、c,调用递归函数,之中只调换了一次,没有两次,我录个视频给你看运行过程,看发不发得上来

肚子饿了233 发表于 2020-12-22 12:43:05

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

谢谢大神!!! {:5_109:}

风过无痕1989 发表于 2020-12-22 13:23:40

肚子饿了233 发表于 2020-12-22 12:43
谢谢大神!!!

视频发不上来,我重新一步一步运行,然后截图,做个动画发上来吧。只是要点时间,我发上来了再通知你

风过无痕1989 发表于 2020-12-22 14:39:15

肚子饿了233 发表于 2020-12-22 12:43
谢谢大神!!!

动画简略地做了一下,因为怕超过 2M,发不上来,作了次优化,可能会导致个别图片发虚,看不清楚,你凑合着看看,知道程序是怎么运行的这个意思就行了

肚子饿了233 发表于 2020-12-22 16:54:14

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

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

风过无痕1989 发表于 2020-12-22 17:37:00

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

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

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

也正是因为如此,我对网上每一个程序都必须经过调试后,才发出来给求助者。这也就是在很多的时候,我回答求助的者时间比别人晚了很多的原因

肚子饿了233 发表于 2020-12-22 17:54:35

风过无痕1989 发表于 2020-12-22 17:37
s 是地址,*s 是取这个地址的值,然后赋给变量 k

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

大神,我用的编译器是Dev-C++;跟小甲鱼老师用的编译器不一样,自己也不会调试{:5_99:}

风过无痕1989 发表于 2020-12-22 18:00:52

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

DEV_C++我电脑里也安装有,主要用于有些 程序使用了变长数组。DEV_C++ 的调试,我也看过不少视频和教程,至今仍然不会。所以,一开始我是使用 VC++6.0,现在我新购一块硬盘,安装了 VS2015

肚子饿了233 发表于 2020-12-22 19:00:45

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

大神,我的联想商店里只有vs2017,你用过这个吗?因为我是新手,对于不同软件也不是很了解,如果这个适合我的话,那我就下载啦~{:5_91:}

风过无痕1989 发表于 2020-12-22 19:10:16

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

应该是差不多的
页: [1] 2
查看完整版本: C语言作业题!大神帮帮我,不想挂科55555