Есть ли реализация «getopt» для Delphi?

Следующий код вычисляет Palidrom для строк длины и нечетной длины.

Не лучшее решение, но работает для обоих случаев

HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE

private static String getLongestPalindrome(String string) {
    String odd = getLongestPalindromeOdd(string);
    String even = getLongestPalindromeEven(string);
    return (odd.length() > even.length() ? odd : even);
}

public static String getLongestPalindromeOdd(final String input) {
    int rightIndex = 0, leftIndex = 0;
    String currentPalindrome = "", longestPalindrome = "";
    for (int centerIndex = 1; centerIndex < input.length() - 1; centerIndex++) {
        leftIndex = centerIndex;
        rightIndex = centerIndex + 1;
        while (leftIndex >= 0 && rightIndex < input.length()) {
            if (input.charAt(leftIndex) != input.charAt(rightIndex)) {
                break;
            }
            currentPalindrome = input.substring(leftIndex, rightIndex + 1);
            longestPalindrome = currentPalindrome.length() > longestPalindrome
                    .length() ? currentPalindrome : longestPalindrome;
            leftIndex--;
            rightIndex++;
        }
    }
    return longestPalindrome;
}

public static String getLongestPalindromeEven(final String input) {
    int rightIndex = 0, leftIndex = 0;
    String currentPalindrome = "", longestPalindrome = "";
    for (int centerIndex = 1; centerIndex < input.length() - 1; centerIndex++) {
        leftIndex = centerIndex - 1;
        rightIndex = centerIndex + 1;
        while (leftIndex >= 0 && rightIndex < input.length()) {
            if (input.charAt(leftIndex) != input.charAt(rightIndex)) {
                break;
            }
            currentPalindrome = input.substring(leftIndex, rightIndex + 1);
            longestPalindrome = currentPalindrome.length() > longestPalindrome
                    .length() ? currentPalindrome : longestPalindrome;
            leftIndex--;
            rightIndex++;
        }
    }
    return longestPalindrome;
}
13
задан Mick 7 May 2009 в 16:04
поделиться

5 ответов

Существует реализация TGetOpt, утверждающая, что

реализует вариант getopt для Delphi. Он почти совместим с POSIX, поддерживает длинные параметры, обязательные, необязательные и без аргументов

Вы можете найти его здесь .

10
ответ дан 1 December 2019 в 19:15
поделиться

Файл getopts.pp FPC RTL представляет собой автономный модуль, совместимый с Delphi (включая Delphi2009), который реализует getopt:

Реализация Getopt для Free Pascal, смоделирован на основе GNU getopt

Модуль доступен в репозитории FPC SVN.

11
ответ дан 1 December 2019 в 19:15
поделиться

Что не так с FindCmdLineSwitch в модуле SysUtils?

if FindCmdLineSwitch('h',['-'],false) then
  Print_Help();
if FindCmdLineSwitch('v',['-'],false) then
  print_Version();

вам придется перебирать параметры, чтобы получить значения, но это довольно просто сделать:

if FindCmdLineSwitch('f',['-'],false) then
  for ix := 1 to paramcount do
    if (paramStr(ix) = '-f') and (ix < paramcount) then
      begin
        if fileExists( ParamStr(ix+1) ) then
          filename := ParamStr(ix+1);
        break;
      end
3
ответ дан 1 December 2019 в 19:15
поделиться

Там есть «Парсер командной строки Gastown Delphi», исходный код которого недавно был открыт (например, на Torry's ). Я никогда им не пользовался, поэтому не могу его комментировать.

0
ответ дан 1 December 2019 в 19:15
поделиться

Ничего встроенного - кроме вас сделать его довольно легко. Это должно быть близко к тому, к чему вы привыкли

TsoCommandLineParser = class
private
  fArguments:TStringList;
public
  constructor Create();
  destructor Destroy(); override;

  function GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
end;


constructor TsoCommandLineParser.Create();
var
  i:Integer;
begin
  inherited Create();
  fArguments := TStringList.Create();
  for i := 1 to ParamCount() do
  begin
    fArguments.Add(ParamStr(i));
  end;
end;

destructor TsoCommandLineParser.Destroy();
begin
  fArguments.Free();
  inherited Destroy();
end;

function TsoCommandLineParser.GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
var
  i:Integer;
begin
  i := fArguments.IndexOfName(pArgument);
  if i > -1 then
  begin
    Result := fArguments.ValueFromIndex[i];
  end
  else
  begin
    Result := pDefaultValue;
  end;
end;
3
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: