一道C++面试题,求助

Pthinker 2008-09-01 01:51:56
自定义int strlen(char *p),函数体内不能有任何变量申明,如何实现?
...全文
474 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiazheng 2008-09-02
  • 打赏
  • 举报
回复
return sizeof(ptr)-1;
kkoo_ook 2008-09-02
  • 打赏
  • 举报
回复
我那个都说了,是写着玩的,别太在意了。

算了吧,一个破面试题而以,没什么大不了的!

开心上网才是最主要的问题

OK,大家 笑^-^笑

传说回帖即可获得 10 分可用分!
kkoo_ook 2008-09-02
  • 打赏
  • 举报
回复


// 37楼,前面我回得太急,得罪了,也说错了一些东西,请多多包函。

int strlen(char *p) //恕我眼拙,实在看不出这函数有什么好的地方。
{

if(p==NULL) //看得怪眼熟的
return -1; //看得怪眼熟的

_asm xor ebx,ebx //在有的编译器里,ebx被在下面的while(*p++)占用了
_asm xor eax,eax ;//画蛇添足,有何用处?

while(*p++) //在有的编译器里,ebx在这里被占用了,可能会导致ebx的值不正确
{
_asm {inc ebx} //循环了多少次,有何效率可言?
}
_asm mov eax,ebx ;//不明白什么意思

//函数返回了什么?

}

//也许编译器的不同,我又说错了什么,还请多多包函。

steven_well 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 kkoo_ook 的回复:]
可以用汇编的话,我也写一个非递归版本的玩玩


C/C++ code

#include<stdio.h>

int strlen(char *p)
{

if(p==NULL)
return -1;

asm mov dx, p

while(*p++)
;

asm sub p, dx

return p-1;
}
[/Quote]
你的什么东西哦!给你看哈这个哈:
#include <iostream>

using namespace std;
int strlen(char *p)
{

if(p==NULL)
return -1;

_asm xor ebx,ebx
_asm xor eax,eax

while(*p++)
{
_asm {inc ebx}
}
_asm mov eax,ebx


}

int main() {
char p[] = "abcdef";
cout << strlen(p)<<endl;
return 0;
}
result:6
SeanHwang 2008-09-01
  • 打赏
  • 举报
回复
递归,很早就有的题目~
steven_well 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 cppstl 的回复:]
引用 27 楼 LW_HM 的回复:
p的值是要变的哦!去调试一哈就晓得了

形参P只是栈中的一个临时变量,改变了也没关系啊。
[/Quote]
当然你说的不是不对,但是要看在非主函数中的值变化情况,就要它了哦。
fireguyww 2008-09-01
  • 打赏
  • 举报
回复
用递归解决
虽然数组本身没有按值传递,但是指向数组的指针却是按值传递,因此在函数内部改变指针的值,对函数外部没有影响.
思路:
10厘米的尺子的长度
= 1厘米处至10厘米处的长度 + 1厘米
= 2厘米处至10厘米处的长度+ 1厘米 + 1厘米
= 3厘米处至10厘米处的长度+ 1厘米 + 1厘米 + 1厘米
....
...
..

#include <iostream>
int strlen(char * p);
using namespace std;

int main(int argc, char *argv[])
{
cout << "Enter a string:";
char str[50];
cin.getline(str, 50);
cout << "str length: " << strlen(str);

cin.get()
return 0;
}

int strlen(char * p)
{
if(p[0] == '\0')
return 0;
else
return strlen(++p)+1;
}
kkoo_ook 2008-09-01
  • 打赏
  • 举报
回复
不需要调试,p和*p的值不会变,运行一下不就知道了吗(相应的编译器自己稍微修改)

sizeof()返回一个对象或者类型所占的内存字节数

所有的指针变量所占内存大小相等
char *p

sizeof(p)在16位下是2,在32位下是4

cppstl 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 LW_HM 的回复:]
不过这是为什么呢?sizeof()怎么用?
[/Quote]
这是因为p是一个指针,在32位的机器上指针所占的内存大小刚好是4字节。
cppstl 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 LW_HM 的回复:]
p的值是要变的哦!去调试一哈就晓得了
[/Quote]
形参P只是栈中的一个临时变量,改变了也没关系啊。
zhirom 2008-09-01
  • 打赏
  • 举报
回复
学习ing...
steven_well 2008-09-01
  • 打赏
  • 举报
回复
不过这是为什么呢?sizeof()怎么用?
steven_well 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zmlovelx 的回复:]
C/C++ code
//当参数为char*时为何不偷懒
#include <iostream>
using namespace std;

int my_strlen(char *p)
{
return sizeof(p);
}

int main() {
char p[] = "abcd";
cout << my_strlen(p);
return 0;
}
//4Press any key to continue
[/Quote]
这个是巧合哈!
试试这个:
#include <iostream>
using namespace std;

int my_strlen(char *p)
{
return sizeof(p);
}

int main() {
char p[] = "a";
cout << my_strlen(p)<<endl;
return 0;
}
results:4
steven_well 2008-09-01
  • 打赏
  • 举报
回复
p的值是要变的哦!去调试一哈就晓得了
kkoo_ook 2008-09-01
  • 打赏
  • 举报
回复
在别人的机子上,没有编译器,所以就在网上下了个TC编译器

在TC编译器,是运行成功的
tangshuiling 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Chiyer 的回复:]
C/C++ code
#include <stdio.h>

int strlen(char *p)
{
if (!p || !(*p))
return 0;
return 1 + strlen(++p);

}

// test
int main()
{
printf("length = %d\n", strlen("abcdefg"));
return 0;

}
[/Quote]

还是觉得星羽哥的代码有味道一点!
帅得不敢出门 2008-09-01
  • 打赏
  • 举报
回复
22楼你用的是什么编译器?
kkoo_ook 2008-09-01
  • 打赏
  • 举报
回复
晕,#include<stdio.h>这也复制上去了
kkoo_ook 2008-09-01
  • 打赏
  • 举报
回复
可以用汇编的话,我也写一个非递归版本的玩玩



#include<stdio.h>

int strlen(char *p)
{

if(p==NULL)
return -1;

asm mov dx, p

while(*p++)
;

asm sub p, dx

return p-1;
}



zlhmhggg 2008-09-01
  • 打赏
  • 举报
回复
向你学习~~~
加载更多回复(20)

64,654

社区成员

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

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