fx. jeg har et tal (random men som en string fordi brugeren selv kan taste det ind). Det tal kan se sådan her ud 38/012/0013/00001/0053 osv.
Så er det at jeg har brug for at vide hvor mange 0'er der er forand selve det tal hvis der er nogen. Men hvordan kan jeg det ? og hvordan kan jeg vide hvor mange der er af 0'er hvis der er noget ?
Du kalder "38/012/0013/00001/0053" for ét tal. Vil du bare vide hvor mange nuller der er foran hele den streng, eller foran de enkelte tal (her delt med '/')?...Og i så fald, kan man regne med at strengen altid er formateret sådan?
Denne funktion (som sikkert kan laves smartere, når jeg er mere vågen :)), finder antallet af nuller foran en given streng:
function NumLeadZero(str: String): integer; var i: integer; begin result:=0; for i:=0 to length(str) do if (Ord(str[i+1]) <> 48) then begin result:=i; exit; end; end;
Hvis du vil ha at NyStr skal ha' består KUN af det samme antal nuller, kan du f.eks. bruge følgende:
Hvis du kun skal finde de første nuller i en streng så:
function CountFirstZeroes(const str : string) : integer; var p : PChar; begin Result := 0; p := PChar(str); while (p^ <> #00) and (p^ = '0') do begin Inc(Result); Inc(p); end; end;
function NumLeadZeroASM(Const Value : String): integer; asm mov edx, $00 // Result := 0 test eax, eax //Er strengen tom ? jz @@Done //Så Exit mov ecx,[eax - $04] // Læs længden på vores streng, og gem den i ecx @@Again: cmp edx, ecx // Result < Length(Value) cmp byte ptr [eax + edx], $30 //Value[Result] = '0' jnz @@Done //Enten har vi fundet noget der ikke er et '0', eller enden er nået --> Hop til Done inc edx //Tæl vores tæller jmp @@Again //Loop @@Done: mov eax, edx //Retuner værdien af vores tæller end;
function NumLeadZero(Const Value : String): integer; begin Result := 0; while (Value[Result + 1] = #48) and (Result < Length(Value)) do Inc(Result); end;
@@Again: cmp edx, ecx // Result < Length(Value) cmp byte ptr [eax + edx], $30 //Value[Result] = '0' jnz @@Done //Enten har vi fundet noget der ikke er et '0', eller enden er nået --> Hop til Done inc edx //Tæl vores tæller
athlon-pascal >> Du har ret. 2x cmp i træk viker ikke. Nå men funktionen er også mest skrevet for sjov.
Og når nu doc404 begynte med at skrive en hurtigere funktion, så ville jeg lige skrive en i Assembler :-)
function NumLeadZeroASM(Const Value : String): integer; asm mov edx, $00 // Result := 0 test eax, eax //Er strengen tom ? jz @@Done //Så Exit mov ecx,[eax - $04] // Læs længden på vores streng, og gem den i ecx @@Again: cmp edx, ecx // Result = Length(Value) ? je @@Done //Hvis så hop til Done cmp byte ptr [eax + edx], $30 //Value[Result] = '0' jnz @@Done //Enten har vi fundet noget der ikke er et '0', eller enden er nået --> Hop til Done inc edx //Tæl vores tæller jmp @@Again //Loop @@Done: mov eax, edx //Retuner værdien af vores tæller end;
Jens -> "athlon-pascal >> Du har ret. 2x cmp i træk viker ikke. Nå men funktionen er også mest skrevet for sjov." Det var doc404 der kommenterede din Assembler-funktion, jeg forstår ikke Assembler :-)
Og lad os så lige få noget der virker:
function CounterZero(input:string):integer; var i :integer; begin result := 0; for i:= 1 to length(input) do if input[I] = '0' then inc(result); else Break; end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.