delphi 2010
我有一个程序,用户输入他们的姓名和姓氏,然后我将姓氏和姓名提取到两个不同的字符串中。有人可以在代码中解释+1,3和pos''的重要性,这些值何时需要更改?(例如为什么它是+1而不是+2)谢谢
procedure TForm1.GenerateOnceoffPassword1Click(Sender: TObject);
var
suser, ssurname, sname, spassword : string;
arrpassword : array[1..150] of string;
begin
inc(icounter);
suser := inputbox('Enter name and surname','lower case ONLY','');
ssurname := copy(suser,pos(' ',suser)+1, 3);
sname := copy(suser, 1, pos(' ',suser)-1);
答案 0 :(得分:1)
我假设您已经在OLH或其他地方查找了Copy和Pos功能。所以,在你的q和评论中处理你的观点:
一个。 “copy(suser,pos('',suser)+1,3)中的”+1“表示对Copy的调用应该在调用返回的suser中第一次出现空格字符后的第一个字符处开始到Pos()。如果Pos()在suser中没有找到空格,它将返回0,因此复制将从suser的第一个字符开始。另见下文第2点。
湾“3”表示复制应该复制(最多)3个字符,从它被告知开始复制“pos()+ 1”。我说“最多”因为这就是Copy()的工作方式,代码中的任何内容都不会强迫用户在第一个空格后输入一个包含3个或更多字符的字符串。似乎有点奇怪,姓氏应限制在最多3个字符,顺便说一句。
℃。大概在你的评论中提到“1,= 1”,你的意思是“1,= - 1”无论如何,第二次调用Copy()中的“1”表示“从suser的第一个字符开始复制”, “pos() - 1”表示最多复制X个字符,其中X比调用pos()返回的值小1,换句话说,在第一次出现空格之前将字符从suser复制到1。如果suser中没有空格,则会导致sname为空。
请注意:
当使用Pos()和Copy()等函数分割字符串时,最好养成使用Trim()函数从子字符串中删除任何前导或尾随空格的习惯(s )。在点a。如上所述,您编写的代码忽略了用户可能键入两个(或更多)连续空格的可能性。
不是提示用户仅使用小写,而是养成编写无论大小写都有效的代码的习惯。显然,这不是q中特定代码的问题,但无论如何。
传统上,Delphi中的字符串是基于1的,这意味着,如果非空白,则可以访问该字符串,就好像它是一个起始索引为1的数组。编译器的较新版本(比D2010更新,对于像Android这样的移动平台使用基于0的字符串,这会导致像你这样的代码算法在未经修改的情况下出现问题。