一面微创题--字符串逆序输出

     最近一直在等面试消息,都有点着急了,的确,还有太多不足,笔面之后的一面技术面,幸运地是在三个面试者中面试官留下了我,可是一句话又搞的我一点底都没了:“你别以为你通过了就怎么着,其实你也很菜,你写的程序不过就是让我大概看懂了罢了。”可不,趁现在等消息好好想想写的那程序得了。当时一看题目感觉挺简单的,字符串逆序很容易实现呐。

      实现要求是至多只能申请一个空间,不能用库函数。当时面试的时候是这样考虑的,字符数组做函数参数传递,此时如果直接传递的话就成值传参了,所以立马就考虑到用二级指针。面试时写的程序大概如下:

[c-sharp]view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void reverse(char **src,int n);  
  5. int main(int argc,char **argv)  
  6. {  
  7.     char test[] = "I love you!";  
  8.     cout<<test<<endl;  
  9.     reverse(&test,sizeof(test));  
  10.     cout<<test<<endl;  
  11. }  
  12.   
  13. void reverse(char **src,int n)  
  14. {  
  15.     char temp = '/0';  
  16.     for(int i=0;i<n/2;i++)  
  17.     {  
  18.         temp = (*src)[i];  
  19.         *src[i] = *src[n-i-2];  
  20.         *src[n-i-2] = temp;  
  21.     }  
  22.     *src[n-1] = '/0';  
  23.     return ;  
  24. }  

 

可是此时编译运行却出错:“reverse”: 不能将参数 1 从“char (*)[12]”转换为“char **”;

之后在main函数中加入:cout<<typeid(test).name()<<endl;cout<<typeid(&test).name()<<endl;发现,test为char *类型指针,而&test为char (*)[12]类型数组指针。所以参数传递时明显不匹配,数组指针不能传向二级指针形参。修改代码后:

[c-sharp]view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void reverse(char **src,int n);  
  5. int main(int argc,char **argv)  
  6. {  
  7.     char test[] = "I love you!";  
  8.         cout<<typeid(test).name()<<endl;  
  9.         cout<<typeid(&test).name()<<endl;  
  10.     cout<<test<<endl;  
  11.         char *p = test;  
  12.     reverse(&p,sizeof(test));  
  13.         //reverse(&test,sizeof(test));  
  14.     cout<<test<<endl;  
  15. }  
  16.   
  17. void reverse(char **src,int n)  
  18. {  
  19.     char temp = '/0';  
  20.     for(int i=0;i<n/2;i++)  
  21.     {  
  22.         temp = *src[i];  
  23.         *src[i] = *src[n-i-2];  
  24.         *src[n-i-2] = temp;  
  25.     }  
  26.     *src[n-1] = '/0';  
  27.     return ;  
  28. }  

通过编译运行后却又出现内存错误,为什么呢?

再看看reverse函数,优先级又出错了,*src[i];....?这个算什么呢?[]的优先级比*高,所以首先src是与[]结合的,那再通过解引用获得的会是什么元素,此处已经明显内存溢出了。所以继续修改:

[c-sharp]view plaincopy
  1. void reverse(char **src,int n)  
  2. {  
  3.     char temp = '/0';  
  4.     for(int i=0;i<n/2;i++)  
  5.     {  
  6.         temp = (*src)[i];  
  7.         (*src)[i] = (*src)[n-i-2];  
  8.         (*src)[n-i-2] = temp;  
  9.     }  
  10.     (*src)[n-1] = '/0';  
  11.     return ;  
  12. }  

再继续编译运行,总算可以将"I love you!"逆序成"!uoy evol I"了。可是下面这个程序却让我彻彻底底挂掉了。

[cpp]view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void reverse(char *src,int n);  
  5. int main(int argc,char **argv)  
  6. {  
  7.     char test[] = "I love you!";  
  8.     cout<<test<<endl;  
  9.     reverse(test,sizeof(test));  
  10.     cout<<test<<endl;  
  11. }  
  12.   
  13. void reverse(char *src,int n)  
  14. {  
  15.     char temp = '/0';  
  16.     for(int i = 0;i<n/2;i++)  
  17.     {  
  18.         temp = src[i];  
  19.         src[i] = src[n-i-2];  
  20.         src[n-i-2] = temp;  
  21.     }  
  22.     return ;  
  23. }  

同样达到了字符串逆序输出的效果。怎么感觉有点画蛇添足的效果呢,函数是传入的是值形参,尽管这个值的类型是个指针类型,但是对于这个形参和实参来说,所指向的位置是一样的,即所操作的地址是一样的,所以直接用数组名操作即可。哎,果然还太菜呐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

返回北京

6点15做311新街口转800到光明桥转800到医院7:40挂上号9:30叫到号&#xff0c;护士站调病例分诊大屏幕显示叫号&#xff0c;可到挂号处缴费。到一层影象预约中心预约&#xff0c;相同检查可合并。胸片预约可当时等候检查。一层牌号抽血。乘434方庄环岛南下&#xff0c;王沛肿瘤科…

C++中的强制转换

标准c中主要有四种强制转换类型运算符&#xff1a; const_cast&#xff0c;reinterpret_cast&#xff0c;static_cast&#xff0c;dynamic_cast等等。 1&#xff09;static_cast<T*>&#xff08;a&#xff09; 将地址a转换成类型T&#xff0c;T和a必须是指针、引用、算术…

SQL_经验碎片

这个帖子主要记录一些sql的学习经验转载于:https://www.cnblogs.com/SDJL/archive/2009/09/08/1562607.html

【转】Ubuntu 16.04 Nvidia驱动安装(run方式)

转自&#xff1a;Ubuntu 16.04 Nvidia驱动安装(run方式)_lihe的博客-CSDN博客 1.下载驱动程序 Nvidia驱动下载 https://www.geforce.cn/drivers/beta-legacy http://www.nvidia.cn/Download/index.aspx 根据显卡选择适用的驱动版本&#xff0c;下载完之后是一个名称为 NVIDIA…

volatile的作用

一个定义为volatile的变量是说这变量可能会被意想不到地改变&#xff0c;这样&#xff0c;编译器就不会去假设这个变量的值了。精确地说就是&#xff0c;优化器在用到这个变量时必须每次都小心地重新读取这个变量的值&#xff0c;而不是使用保存在寄存器里的备份。下面是volati…

2008R2Win7管理九DNS冗余和恢复

2008R2Win7管理九DNS冗余和恢复 本文介绍如何在ad中的主dns崩溃后快速利用备份dns将主dns恢复.以及在主dns完好的时候进行dns冗余备份 本文在file这台服务器上安装好dns角色来作为主dns的备份,安装角色的过程不在详细描述,略过.相信大家都知道了. 本问对拓扑图略有改动,故再次更…

预处理命令中的#和##

在c/c的程序设计中&#xff0c;有的时候不免要实现某些对象转换出相应名字字符串或两对象名直接相连的情况&#xff0c;这时候可采用宏定义中加入#和##分别实现相应功能。下面是摘抄的一段解释。 The # and ## preprocessor operators are used with the #define preprocessor …

【转】DICOM通讯(ACSE->DIMSE->Worklist)

转自&#xff1a;DICOM通讯&#xff08;ACSE-&#xff1e;DIMSE-&#xff1e;Worklist&#xff09; - 知乎 1 DICOM通讯概要介绍 DICOM通讯和TCP IP的设计原理别无二致。从用户数据到网络上传输数据的过程中&#xff0c;要经历多层协议处理&#xff0c;每经一层&#xff0c;就…

DipperRiver.Net通信协议设计

说明名称[长度,单位&#xff1a;字节]包结构Header[10]&#xff1a;包头Body[21?]&#xff1a;包体Header[10]协议头[1]:1字节长度,如0x07协议版本[1]&#xff1a;1字节长度,如0x01Body长度[4]:4字节长度的数字&#xff0c;即Body长度最大支持4G保留[4]&#xff1a;Body[25?]…

winCE改变字库方法

更新系统字库&#xff1a;例如要在 WinCE5.0 加入微软雅黑字体的支持 。 第一步&#xff1a;增加如下注册表 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontPath] "FontPath""// Windows " ; 字库文件所在目录 [HKEY_LOCAL_MACHINE/SYSTEM/GDI] "…

程序员九重镜界,很老的今天刚刚翻出来

今天下午翻电脑找到这个--程序员九重镜界。很旧的&#xff0c;呵呵。第一重&#xff1a; 在哪本电脑杂志上看见软件工程师这个职业介绍&#xff0c;或者走在大街上看见某某软件培训机构鼓吹培训完就能年薪10万的广告&#xff0c;有些羡慕那些编程序的&#xff0c;自己有些蠢蠢欲…

【转】dicom通讯的工作方式及dicom标准简介!!

转自&#xff1a;dicom通讯的工作方式及dicom标准简介 - assassinx - 博客园 本文主要讲述dicom标准及dicom通讯的工作方式。dicom全称医学数字图像与通讯 其实嘛就两个方面 那就是“存储”跟“通讯”。 文件数据组织方式 网络数据组织方式。文件数据组织方式就是解析静态的di…

XIP与HIVE

我们的Image主要由两部分组成&#xff1a;XIPKERNEL.bin和NK.bin,XIPKERNEL.bin中的东西就是那些WinCE中比较核心的又需要经常加载的一些程序和DLL文件&#xff0c;这些文件会被Boot Loader在刚启动的时候拷贝到RAM中去&#xff0c;这样就可以在RAM中XIP&#xff08;Excute in …

[Silverlight]16进制颜色转ARGB及Color转Int32

16进制色字符串转ARGB做Web的都喜欢用16进制字符串标识颜色&#xff0c;比如“#F5F5F5”这类的&#xff0c;自然这个到了Silverlight/WPF中就要用ARGB表示&#xff1a;“#FFF5F5F5”&#xff08;前两位标识Alpha&#xff0c;即透明度&#xff09;。这在XAML中没有任何问题&…

【转】DICOM通信 - PDU数据包(1)

转自&#xff1a;DICOM通信 - PDU数据包(1)_翼遥君的博客-CSDN博客 DICOM上层协议为DIMSE提供透明的网络数据传输服务&#xff0c;即以上层协议规定的协议数据单元传送接收DIMSE的命令流与数据流。上层协议中制定了上层服务以及协议数据单元(Protocol Data Unit&#xff0c;PD…

windows mobile 编译(生成镜像)提速

windows mobile 编译镜像总是让人难以忍受的耗时&#xff0c;当然我们不能每次修改一点东西就build All一次。 下面是自己工作中积累的【不同情况下使用的编译命令】来加速生成镜像的过程&#xff0c;不排除有错的可能&#xff0c;欢迎指正。 对于修改&#xff0c;一般可以分…

ASP.NET MVC + ADO.NET EF 项目实战(二):设计过程与设计工具

工欲善其事&#xff0c;必先利其器。好的工具能够成倍提升工作效率。ASP.NET MVC和ADO.NET EF也是因为其工具出色而受到欢迎。例如&#xff1a; MVC所提供的View模板工具&#xff1b; MVC所提供的View切换、向导工具&#xff1b; ADO.NET EF提供的模型设计工具&#xff1b; ADO…

【转】DICOM通信 - PDU数据包(2)

转自&#xff1a;DICOM通信 - PDU数据包(2)_翼遥君的博客-CSDN博客 DICOM通信-PDU数据包(1)博客中主要分析了DICOM通信协议的连接协商请求和连接协商应答。 在7个PDU数据包中还有5个数据包&#xff0c;从结构上来看&#xff0c;他们比协议的协商过程要简单明了一些。 这篇博客…

Win CE下编译选项介绍

在WinCE中&#xff0c;在"Build OS”菜单中&#xff0c;我们会看到不同的编译选项&#xff1a; "Sysgen"&#xff0c;"Build and Sysgen"和"Build and Sysgen current BSP" Sysgen&#xff1a;不用多说&#xff0c;当你在"Catalog&quo…

“启动Word时提示出错,只能用安全模式才能打开”的解决方法

启动Word时提示出错&#xff0c;只能用安全模式才能打开&#xff0c;在这种模式下&#xff0c;一些功能将被禁用。而且&#xff0c;每次启动都会出现这样的提示信息&#xff0c;同事们很多向我求助。提示窗口如下&#xff1a; 于是我采取了以下一些措施&#xff1a; 1、用Offic…