Avatar billede lemon Nybegynder
30. september 2004 - 14:48 Der er 1 kommentar og
1 løsning

Opdel commandline+argument

Sagen er den, at jeg modtager en kommando + argumenter gennem winsock, og skal så have behandlet denne ud fra kommando og argumenter.

Jeg har følgende inputs til rådighed:
- char* til starten af inputtet.
- unsigned int med antal bytes i linjen (eksklusiv <CRLF>).

Om linjen ved jeg at:
- Kommandoen har formen [[modul.]modul.]kommando[ argument[,"argument"]]
  Altså et, eller flere, ikke opbligatoriske punktum-terminerede modulnavne, en obligatorisk kommando, et variabelt antal ikke opbligatoriske argumenter som enten er space-terminerede eller escapede med ". Yderligere kan et "-escaped argument indeholde \", som selvfølgeligt skal oversættes til "

Jeg kunne godt tænke mig at omdanne ovenstående til eks. en struct med en int for antal moduler, et array af char* til modulnavnene, en char* til kommandoen samt en int til antal argumenter og et array af char* til argumenterne.
Men jeg er ikke sikker på om det er den smarteste måde at forberede kommando og argumenter, eller om der findes en smartere måde, samt hvordan fremgangsmåden evt. ville være.

(med andre ord: Point til det bedste løsningsforslag, i form af kode, pseudokode, step-by-step beskrivelse eller lignende)
Avatar billede lemon Nybegynder
30. september 2004 - 19:38 #1
Har selv løst det.

http://www.eksperten.dk/spm/545539

Evt. bedre forslag godtages dog stadig... men så skal de dælme også være gode ;)
Avatar billede bertelbrander Novice
30. september 2004 - 20:15 #2
#include <iostream>
#include <string>

void Split(std::string Command)
{
  std::string Sub;
  std::string::size_type n;
  while((n = Command.find('.')) != std::string::npos)
  {
      Sub = Command.substr(0, n);
      std::cout << "Module: " << Sub << std::endl;
      Command = Command.substr(n + 1);
  }
  if((n = Command.find(' ')) != std::string::npos)
  {
      Sub = Command.substr(0, n);
      std::cout << "Command: " << Sub << std::endl;
      Command = Command.substr(n + 1);
      while((n = Command.find(',')) != std::string::npos)
      {
        Sub = Command.substr(0, n);
        Command = Command.substr(n + 1);
        n = Sub.find_first_not_of(" ");
        Sub = Sub.substr(n);
        std::cout << "Arg: " << Sub << std::endl;
      }
      if(Command.size())
      {
        n = Command.find_first_not_of(" ");
        Command = Command.substr(n);
        std::cout << "Arg: " << Command << std::endl;
      }
  }
  else
  {
      std::cout << "Command: " << Command << std::endl;
  }
}

int main()
{
  const char *Command1 = "Mod1.mod2.kommando arg1, arg2, arg3";
  const char *Command2 = "Mod1.kommando";
  Split(Command1);
  std::cout << std::endl;
  Split(Command2);
}
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester