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

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

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

可是此时编译运行却出错:“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. void reverse(char **src,int n);
  4. int main(int argc,char **argv)
  5. {
  6. char test[] = "I love you!";
  7. cout<<typeid(test).name()<<endl;
  8. cout<<typeid(&test).name()<<endl;
  9. cout<<test<<endl;
  10. char *p = test;
  11. reverse(&p,sizeof(test));
  12. //reverse(&test,sizeof(test));
  13. cout<<test<<endl;
  14. }
  15. void reverse(char **src,int n)
  16. {
  17. char temp = '/0';
  18. for(int i=0;i<n/2;i++)
  19. {
  20. temp = *src[i];
  21. *src[i] = *src[n-i-2];
  22. *src[n-i-2] = temp;
  23. }
  24. *src[n-1] = '/0';
  25. return ;
  26. }

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

再看看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. void reverse(char *src,int n);
  4. int main(int argc,char **argv)
  5. {
  6. char test[] = "I love you!";
  7. cout<<test<<endl;
  8. reverse(test,sizeof(test));
  9. cout<<test<<endl;
  10. }
  11. void reverse(char *src,int n)
  12. {
  13. char temp = '/0';
  14. for(int i = 0;i<n/2;i++)
  15. {
  16. temp = src[i];
  17. src[i] = src[n-i-2];
  18. src[n-i-2] = temp;
  19. }
  20. return ;
  21. }

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

一面微创题--字符串逆序输出相关推荐

  1. python逆序输出字符串_python实现对指定输入的字符串逆序输出的6种方法

    编写一个Python程序,提示用户输入一个字符串,程按照你的要分享编写的逆序显示字符串的Python3程序如下 s = input("请输入一个字符串:")print(s[::-1 ...

  2. 编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略

    编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略 ...

  3. 编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略

    编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 目录 字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 ...

  4. linux C 学习 简单字符串逆序输出

    看了下网上的字符串逆序输出,都相对复杂,下面给一个简单的字符串逆序输出小程序实现: [cpp] view plaincopy #include <stdio.h> #include < ...

  5. 将一个字符串逆序输出

    将输入的一个字符串逆序输出.例如,输入abcde,则输出edcba. 用普通函数和递归函数实现. 普通函数源程序: #include<stdio.h> #include<string ...

  6. python把字符串逆序输出_python实现对指定输入的字符串逆序输出的6种方法

    python实现对指定输入的字符串逆序输出的6种方法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python实现对指定输入的字符串逆序输出的6种方法.txt  ...

  7. NYOJ 266 字符串逆序输出

    字符串逆序输出 时间限制:3000 ms  |  内存限制:65535 KB 难度:0 描述 给定一行字符,逆序输出此行(空格.数字不输出) 输入 第一行是一个整数N(N<10)表示测试数据的组 ...

  8. python逆序输出字符串_python实现对指定输入的字符串逆序输出的方法

    这篇文章主要介绍了python实现对指定输入的字符串逆序输出的6种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作 ...

  9. C语言——字符串逆序输出

    [问题描述]将输入的字符串逆序输出 [输入形式]要求输入一个字符串 [输出形式]逆序后输出 [样例输入]abcd [样例输出]dcba #include <stdio.h> #includ ...

最新文章

  1. Jake Coco - Under The Covers, Vol. 2 {2011}
  2. 《实用机器学习》——1.4 本书概述
  3. 6 种不同情况下写的代码
  4. 反制爬虫之Burp Suite RCE
  5. mybatis入门配置——基于xml配置
  6. Linux进程全解9——进程状态、system函数、进程间的关系
  7. CCF NOI1060 雷同检测
  8. linux命令大全-比较常用的
  9. Caffe(12)--实现YOLOv2目标检测
  10. 无法打开网上邻居计算机,win7网上邻居在哪 无法访问怎么办【图文】
  11. 《Visual Basic.Net 循序渐进》
  12. 汇率换算自然语言理解功能IOS DEMO
  13. linux vmware文件互传,Linux与Windows文件互传(VMWare)
  14. 三子棋小游戏(经过轻微改编可变为五子棋)
  15. Re28:读论文 CECP Charge Prediction by Constitutive Elements Matching of Crimes
  16. Jetson Nano | darknet (yolov3.4-tiny)摄像头实时检测
  17. 【本地调试环境一键安装包】php+mysql平台搭建集成软件总汇【php环境汇总】
  18. .net 前台调用后台方法
  19. C语言:浙大版《C语言程序设计(第3版)》题目集 习题5-6 使用函数输出水仙花数 (20 分)
  20. Linux系统Sudo命令的使用说明

热门文章

  1. oracle 其他表空间,Oracle查询表空间使用情况以及其他查询
  2. 【剑指offer - C++/Java】9、变态跳台阶
  3. 对比Oracle和Mysql在锁机制上的类似和差异点
  4. Python小数据池
  5. ccf--20140903--字符串匹配
  6. 时钟抖动对高速ADC采样系统的影响
  7. 【Xmail】使用Xmail搭建局域网邮件服务器
  8. maven2-snapshot快照库和release发布库的应用
  9. 其他技术(Path)
  10. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]46.Sigma协议正确性、公正性和零知识性