关于字符串和动态数组的 Delphi 试题,目前贴出第一部分,答对者有分,全答对者100分!(300分)

  • 主题发起人 LiChaoHui
  • 开始时间
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
共8道题,
请写出每道题所显示的消息字符串
注意,不准在Delphi中运行测试,
以最快的速度答出,并写出自己所花的时间(秒)

//题1
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
begin
s := 'abcde';
PChar(s)[0] := 'm';
ShowMessage(s);
end;

//题2
procedure TForm1.Button2Click(Sender: TObject);
var
s: String;
begin
s := 'abcde';
s[1] := 'v';
PChar(s)[0] := 'm';
ShowMessage(s);
end;

//题3
procedure TForm1.Button3Click(Sender: TObject);
var
s1, s2: String;
begin
s1 := 'abcde';
s1[1] := 'v';
s2 := s1;
PChar(s2)[0] := 'm';
ShowMessage(s1);
end;

//题4
procedure TForm1.Button4Click(Sender: TObject);
var
s1, s2: String;
begin
s1 := StringOfChar('A', 20) + #0 + 'abcde';
s2 := s1;
ShowMessage(IntToStr(Length(s2)));
end;

//题5
procedure TForm1.Button5Click(Sender: TObject);
var
s1, s2: String;
begin
s1 := StringOfChar('A', 20) + #0 + 'abcde';
s2 := PChar(s1);
ShowMessage(IntToStr(Length(s2)));
end;

//题6
procedure TForm1.Button6Click(Sender: TObject);
var
s1: String[100];
s2: String;
begin
s1 := 'hello world.'+#0#0#0;
s2 := s1;
Dec(Byte(s1[0]), 3);
PChar(s2)[0] := 'm';
ShowMessage(s1 + IntToStr(Length(s2)));
end;

//题7
procedure TForm1.Button7Click(Sender: TObject);
var
s: String[200];
s1, s2: String;
begin
s := 'abcdefghijklmn';
SetLength(s1, Length(s));
s2 := s1;
Move(s, PChar(s2)^, Length(s));
s1[1] := 'z';
s2[8] := #0;
ShowMessage(s1 + ':' +
IntToStr(Length(PChar(s2))) + IntToStr(Length(s2)));
end;

//题8
procedure TForm1.Button8Click(Sender: TObject);
var
s1: array[1..10] of Char;
s2, s3: array of Char;
begin
FillChar( s1, 10, 'M');
SetLength(s2, 10);
SetLength(s3, 10);
Move(s1, s2[0], 10);
s3 := s2;
s3[0] := 'B';
ShowMessage(PChar(s2));
end;
 
if 用Delphi then 没道德
else 没面子

so raise exception.creation('闭嘴!')
: )
 
能做出来的人,至少也是半个高手了
 
很简单啊,PChar(s)[0]就是s的长度!所以

1. abcde加109-5=104个空格
2. vbcde加109-5=104个空格
3. 同2
4。 26
5。 20
6。 编译绝对会出错,delphi已经对s[0]进行了检查,禁止使用!
7。 估计题目有问题
8 BMMMMMMMMM

共5分钟

LiChaoHui你简直搞笑,第8题当心非法操作!这已经有点缓冲区溢出的
味道了。想当年,这种可以快速取得string长度的技巧我都用烂了....
但delphi2就不许用了,www.....
 
上机试了做对了几题。对以前模糊的概念有了新的认识,多谢了!
第7题应该是:s2[08]:=#0;
 
to firstrose
还不错,答对了3道题,给30分吧,
不过第8题还不能完全算你对
不知道你前两道题的答案是怎么算出来的?
能说一下依据吗?

按照D6默认的变异选项,均能通过编译,但至于怎么运行,我先不说
第8题取短字符串的长度的方法我也不知道是否恰当,
但别人给我的题目是这样的,答得还算快,
至少对Delphi的字符串操作和动态数组有了一定程度的了解了

谢谢参与

to GuanYu
上机做出来,倒是很容易的,过两天会公开答案,
有空再来看看吧
不过贵在参与,也有分
 
關注一下。
 
搞完了,对字符串数组的概念就很清楚了。。。。
 
注意,有的题目可能根本就没有正确答案,也可能题目有问题,大家不要钻
 
还有这样的题嘛?
 
感觉很没面子都没有及格
 
没关系,结果不重要,关键是对字符串和动态数组的理解
我做的时候对了还不到一半呢
能学到点东西也不错啊,这是我的初衷
 
看来能做的人是不多
 
1:
应该有毛病,PCHAR的定义是PCHAR=^CHAR;
是个指针,直接给附值字符是不行的。
2:
应该有毛病,PCHAR的定义是PCHAR=^CHAR;
是个指针,直接给附值字符是不行的。
3:
不管第二题是什么结果,3和2的结果是一样的。具体原因请看引用计数器的机制。
4:
答案:26
字符串的结构:
TAnsiString= record
实际分配空间:LongWord;
引用次数:LongWord

字符串长度:LongWord

数据:array[1..字符产长度]of char

end

GetLength是根据“字符串长度”这个域来获得长度的。而不是像C语言用While一直统计到#0为止。
5:
答案:20
PChar就是字符型指针。根本就没有长度记录单位当然应该是想C语言一样统计。
6:
答案:15
原因是3和4的结合。
也就是S2的附值只是把S2指向S1的存储空间。只要没有S2:=之类的操作就不会触发为S2分配空间的操作。
本题是通过指针来修改S2的内容,就不会触发为S2重新分配空间。
7:
和我上面4,6说的一样
IntToStr(Length(PChar(s2)))是0
IntToStr(Length(s2)))是1
8:
答案:BMMMMMMMMM后面是一些随机字符或者是后面没有字符
begin
FillChar( s1, 10, 'M');
SetLength(s2, 10);
SetLength(s3, 10);
Move(s1, s2[0], 10);
s3 := s2;//把S3指针指向S2
s3[0] := 'B';//S3和S2是共享空间的所以此项既改动S3也改动S2
ShowMessage(PChar(s2));//因为PChar是靠#0来判断结束的所以S2这个数组后面还要显示一些随机字符串,直到遇到#0
end;
十分钟。未能验证对错。
 
gz
第一题在Delphi中运行测试都出错
 
to wr960204
果然不同一般,有两下子,虽然没有全对,
但是可见对Delphi是相当熟悉的
大部分都基本正确,还希望其他人补充一下
谢谢参与,过两天公布答案,大家来点评出题人

to yang_peng_hui
说了不让运行测试,你犯规了,而且还到这儿来说,好意思吗你
就是要考大家呢,一种心理测试,不光是程序
 
[:)],嘻嘻,整点C语言的,保证能晕倒一片
 
出这种题的人如果只在面试的话,可能是找对Delphi底层机制十分熟悉的人,而不是一般那种只会拖拽控件的人。
但是也不见得就能找到真正的高手。
 

Similar threads

I
回复
0
查看
461
import
I
I
回复
0
查看
760
import
I
I
回复
0
查看
594
import
I
I
回复
0
查看
499
import
I
I
回复
0
查看
548
import
I
顶部