今天遇到的一道笔试题 。 郁闷 不懂得作 。 各位帮我看看啊! (高分)

xiangxuf 2008-11-04 09:59:17
写一个反转函数, void reverse(const char *s1, char *s2).. 实现功能如: char *s1="12345678" ,反转赋值后后变成 char *s2="87654321". 要求在函数中不能使用strlen()等任何库函数。 也不能使用除s1 ,s2 之外的任何自定义变量 。
void reverse(const char *s1, char *s2 )
{
代码填写.....

}

各位帮我看看应该是怎么写啊 ???? 谢谢!!
...全文
570 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 kiffa 的回复:]
to 43 楼:
这是个问题,不过只要在第一个循环中赋值就行了,比如:
*s2 = '\0';
while(*s1) ++s1, *++s2 = 'a'; // 全变成'a'。
[/Quote]

肯定的,上面的回答都忽略了这个问题!
kiffa 2008-11-06
  • 打赏
  • 举报
回复
呃,把另一个帖子中的递归也转过来吧,比较绕:

void reverse(const char *s1, char *s2)
{
if(*s1 != '\0')
reverse(++s1, s2);

if(*s1 == '\0')
{
*s2++ = *--s1;
*s2 = '\0';
}
else
{ while(*s2 != '\0') ++s2;
*s2++ = *--s1, *s2 = '\0';
}
}

Jncryang 2008-11-06
  • 打赏
  • 举报
回复
mark
kiffa 2008-11-06
  • 打赏
  • 举报
回复
to 43 楼:
这是个问题,不过只要在第一个循环中赋值就行了,比如:
*s2 = '\0';
while(*s1) ++s1, *++s2 = 'a'; // 全变成'a'。
kiffa 2008-11-06
  • 打赏
  • 举报
回复

void reverse(const char *s1, char *s2)
{
*s2 = 0;
while (*s1 != '\n') ++s1, ++(*s2); // 用s2的第一个字节来记录s1的元素个数。
*(s2 + 1) = *s2;
while(*(s2 + 1) != 0)
{
*s2++ = *--s1;
*(s2 + 1) = *s2 - 1;
}
}
太乙 2008-11-06
  • 打赏
  • 举报
回复
我觉得ls都忽略了一点,假如说
const char *s1, char *s2

这里的s2指向的内存的数据就有你所设定的限定符,咋办?

假如s2指向的内存有'\0','\1'咋办??
bingshanzhiling 2008-11-06
  • 打赏
  • 举报
回复
8楼写的真好啊,学习了... ...'\1'标识符很巧妙... ...
qingkongyihe2008 2008-11-06
  • 打赏
  • 举报
回复
8楼正解
hbqing_ting 2008-11-06
  • 打赏
  • 举报
回复
唉,没有贴代码那个,我做完才看了大家的回复
感觉8楼那位高手的,把第一字符赋值了'\1',
但是在指针s2申请内存的时候,你怎么知道那片内存
原来没有字符'\1'呢,也有可能有的,所以万一
那片内存除了第一个你赋值了'\1',其他的再有一个的话
这个程序就不对了。只是表达自己的意见而已,
不知道这么想是不是画蛇添足。



#include "stdafx.h"
#include <iostream>
using namespace std;

void reverse(const char *s1, char *s2)
{
*s2 = '\0';
s2 = s2 + 1;
while (*s1 !='\0')
{
s1++;
*s2 = '1';
s2++;
}
*s2 = '\0';
s2 = s2-1;
while ( *(s2-1) != '\0')
{
s2--;
}
while(*(s2+1) != '\0')
{
*s2 = *s1;
s1--;
s2++;
}
while (*(s2-1)!='\0')
{
s2--;
}

cout << s2;
cout << endl;
}


int main()
{
const char* s1 = "12345678";
char *s2 = new char[10];
reverse(s1, s2);
return 0;
}
hbqing_ting 2008-11-06
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
using namespace std;

void reverse(const char *s1, char *s2)
{
*s2 = '\0';
s2 = s2 + 1;
while (*s1 !='\0')
{
s1++;
*s2 = '1';
s2++;
}
*s2 = '\0';
s2 = s2-1;
while ( *(s2-1) != '\0')
{
s2--;
}
while(*(s2+1) != '\0')
{
*s2 = *s1;
s1--;
s2++;
}
while (*(s2-1)!='\0')
{
s2--;
}

cout << s2;
cout << endl;
}


int main()
{
const char* s1 = "12345678";
char *s2 = new char[10];
reverse(s1, s2);
return 0;
}
frisky_lobo 2008-11-06
  • 打赏
  • 举报
回复
不能再少了,只有五句:
完成以下工作:
翻转代码,
复制代码,
设置串尾,
空间限定(S2=S1以内长度和范围,防止内存溢出和异常)
frisky_lobo 2008-11-06
  • 打赏
  • 举报
回复
调试正确的通用代码,最简化了
void reverse(const char *s1, char *s2)
{
*s2++ = 0;
do { *s2++ = *s1++; }while( *s1 );
--s1; *--s2 = 0;
do { --s2; }while( *s2 );
do { *s2++ = *s1--; }while( *s2 );
}
kiffa 2008-11-06
  • 打赏
  • 举报
回复
to 49楼:题目限定了函数返回类型是void,不能改成char*...
dwtsteven 2008-11-06
  • 打赏
  • 举报
回复
#include <iostream>
char*revert(const char*str,char*pp)
{
if(*str)
{
pp=revert(str+1,pp);
*pp=*str;
++pp;
*pp=0;
}
return pp;
}
int main()
{
char abc[]="abcdefghijklmnopqrstuvwxyz1234567890";
char def[sizeof(abc)/sizeof(char)+1];
revert(abc,def);
std::cout<<"source:"<<abc<<std::endl
<<"dest:"<<def;
return 0;
}
fcwenmingxing001 2008-11-05
  • 打赏
  • 举报
回复
本人觉得还有一个空间可以用就是'\0'.用它暂存字符,最后再改成'\0'
太乙 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 l521126430 的回复:]
好像之前有个帖子提到了
[/Quote]

对~~~
大写的池 2008-11-05
  • 打赏
  • 举报
回复
up 10 13L 在首尾都做'\0'标记 ,很巧妙!!

16L严重违规...呵呵
大写的池 2008-11-05
  • 打赏
  • 举报
回复
看我的,前提是 s1中不可以有重复的字符


void my_reverse(const char *s1, char *s2 )
{
*s2=*s1;
while (*s1!='\0')
{
++s1;
}
--s1;
while(*s1!=*s2)
{
*(s2+1)=*s2;
*s2=*s1;
--s1;
++s2;
}

++s2;
*s2='\0';
}
int main()
{
char *s1=new char[10];
char *s2=new char[10];
char *p=s1;
char *q=s2;
strcpy(s1,"123456789");
while (*p!='\0')
{ cout<<*p; p++;}

my_reverse(p,q);
while (*q!='\0')
{ cout<<*q; q++;}
system("pause");
}
tianjiao85 2008-11-05
  • 打赏
  • 举报
回复
8楼
l521126430 2008-11-05
  • 打赏
  • 举报
回复
好像之前有个帖子提到了
加载更多回复(35)
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧