鱼C论坛

 找回密码
 立即注册
查看: 2147|回复: 3

字符串逆序输出问题

[复制链接]
发表于 2021-2-15 16:49:26 | 显示全部楼层 |阅读模式

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

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

x
函数接口定义:
void f( char *p );
函数f对p指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。


  1. #include <stdlib.h>
  2. void f( char *p )
  3. {
  4.     int i = 0;
  5.     char *a;
  6.     while (*p != '\0')
  7.     {
  8.         i ++;
  9.         p ++;
  10.     }
  11.     a = (char *)malloc(i);
  12.    
  13.     int m = 0;
  14.     int t = 0;
  15.    
  16.     p = p-i;
  17.     for (m = i-1;m >= 0; m--)
  18.     {
  19.         a[t] = p[m];
  20.         t ++;
  21.     }
  22.     a[t] = '\0';
  23.     p = a;
  24. }
复制代码


如上代码,在dev-c++里可以正常执行,在PTA那个平台里就不行,不知是哪里问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-15 17:50:45 | 显示全部楼层
humm,感觉你这个方法转换不了啊,我在本机上进行测试了一下,也不行。
你可以试试这个代码,正好符合你的要求
  1. void f(char* s) {
  2.     // p指向字符串头部
  3.     char* p = s ;

  4.     // q指向字符串尾部
  5.     char* q = s ;
  6.     while( *q )
  7.         ++q ;
  8.     q -- ;

  9.     // 交换并移动指针,直到p和q交叉
  10.     while(q > p) {
  11.         char t = *p ;
  12.         *p++ = *q ;
  13.         *q-- = t ;
  14.     }
  15. }
复制代码


然后你的第11行的代码应该是算创建了数组的把。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-15 18:26:27 | 显示全部楼层
  1. void f(char * p)
  2. {
  3.         int c , i , n                    ;
  4.         for(n = 0 ; p[n] ; n ++)         ;
  5.         for(i = 0 ; i < n / 2 ; i ++) {
  6.                 c = p[i]                 ;
  7.                 p[i] = p[n - i - 1]      ;
  8.                 p[n - i - 1] = c         ;
  9.         }
  10. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-15 18:55:18 | 显示全部楼层
本帖最后由 一叶枫残 于 2021-2-15 18:57 编辑

我知道你那个问题在哪了:
首先,传入的是一个指针(字符串名就是一个指针,储存的是地址值),因为函数是值传递,它给的是那个地址值,不是那个指针,你只能修改这个地址值的解引用也就是值,你在函数修改其地址值并不对main里面的s的地址值产生任何影响,看下面代码就清楚了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXS 20

  4. void f( char *p );
  5. void ReadString( char *s ); /* 由裁判实现,略去不表 */

  6. int main()
  7. {
  8.         char s[MAXS];
  9.         printf("主函数里:");
  10.         printf("开始时s的地址:%x\n",s);
  11.         printf("请输入字符串:");
  12.         gets(s);
  13.         f(s);
  14.         printf("主函数里:调用函数后s的地址:%x\n", s);

  15.         return 0;
  16. }

  17. /* 你的代码将被嵌在这里 */
  18. void f( char *p )
  19. {
  20.         printf("\n函数f里:\n开始时p的地址:%x\n",p);
  21.         int i = 0;
  22.         char *a;
  23.         printf("开始时a的地址:%x\n",a);
  24.         while (*p != '\0')
  25.             {
  26.                 i ++;
  27.                 p ++;
  28.             }

  29.             a = (char *)malloc(i);
  30.             printf("分配内存后时a的地址:%x\n",a);
  31.             int m = 0;
  32.             int t = 0;
  33.    
  34.             p = p-i;
  35.             for (m = i-1;m >= 0; m--)
  36.             {
  37.                 a[t] = p[m];
  38.                        t ++;
  39.             }
  40.             a[t] ='\0';
  41.             p = a;
  42.             printf("结束后p的地址:%x\n",p);
  43.             printf("结束后a的地址:%x\n\n",a);
  44. }
复制代码
  1. 主函数里:开始时s的地址:62fe00
  2. 请输入字符串:abcd

  3. 函数f里:
  4. 开始时p的地址:62fe00
  5. 开始时a的地址:62fd70
  6. 分配内存后时a的地址:986ad0
  7. 结束后p的地址:986ad0
  8. 结束后a的地址:986ad0

  9. 主函数里:调用函数后s的地址:62fe00
复制代码

你看地址都没有改变,怎么可能实现,还有的是,在PTA里没给出#include<stdlib.h>,意味着你不能使用malloc,一开始出发思路就错了,其实正确做法是调换值,例如字符串是abcd,a和d调换,b和c调换,就变成了dcba了,这个是可以实现的,因为地址值不能改变,但是其解引用后的值可以改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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