Avatar billede neocron Nybegynder
06. april 2007 - 01:20 Der er 5 kommentarer og
1 løsning

Problemer med command-line arguments

Hey,
Jeg er lidt på bar bund her.

Jeg vil gerne kunne forsyne programmet med et heltal, altså af typen int fra commandline.

Eksempelvis: program.exe 140
argv[1] bliver så 140. Eller - det burde det. Det skal laves om til en int, for det er jo som standard en const char*...

Jeg har forsøgt mig med stort set alt hvad min nybegynder-hjerne kan tænke på. static_cast, memcpy, you name it.. :)

int buffer = (int)argv[1];

Hvis vi antager at argv[1] indeholder 140 -
hvorfor outputter den så 1447964 når jeg laver en

printf("%d", buffer);

Hvis jeg outputter den med %s viser den fint 140.

Men - Det store spørgsmål - hvordan *pokker* får jeg den ulyksalige værdi konverteret til en int, således at jeg kan parse den videre til min dertil indrettede funktion som skal bruge en int??
Avatar billede bertelbrander Novice
06. april 2007 - 01:27 #1
Du bliver nødt til at oversætte fra en streng til et integer, strtol kan bruges:
http://www.hmug.org/man/3/strtol.php

int i = strtol(argv[1], 0, 10);
Avatar billede neocron Nybegynder
06. april 2007 - 01:35 #2
Fantastisk :) Det løste hele skidtet :) - Tusind tak.
Kan se at du bruge 0 istedet for pointeren?

Iflg. cplusplus.com skal der benyttes en pointer såsom dette:
http://www.cplusplus.com/reference/clibrary/cstdlib/strtol.html

...
char *pointer;
long buffer;
buffer = strtol(argv[1], &pointer, 10);

Eksemplet gør ikke mere brug af pointeren end jeg gør i dette eksempel.

Så derfor - hvad er forskellen på at bruge 0 eller reference til pointeren?

(Smid i øvrigt et svar)
Avatar billede bertelbrander Novice
06. april 2007 - 01:53 #3
Du kan bruge pointeren til at checke for fejl, dvs. om argv[1] var et gyldigt tal, men hvis ikke du gidder checke kan du bare skrive 0.
Du kan læse hvordan man checker for fejl på siden jeg linkede til.

Jeg samler ikke på point.
Avatar billede bertelbrander Novice
06. april 2007 - 02:03 #4
En C++ løsning, der også checker om det er et gyldigt tal:

#include <sstream>
#include <string>
#include <iostream>

template <typename T>
bool FromString(T& t, const std::string& aStr)
{
  std::stringstream SS(aStr);
  return SS >> t && SS.eof();
}

int main(int argc, char* argv[])
{
  if(argc > 1)
  {
      int i;
      if(FromString(i, argv[1]))
        std::cout << "Et tal: " << i << std::endl;
      else
        std::cout << argv[1] << " er ikke et gyldigt tal" << std::endl;
  }
}
Avatar billede neocron Nybegynder
06. april 2007 - 15:08 #5
Jeg siger mange tak :)
Jeg er ikke kommet til templates endnu, men mon ikke det kommer en dag`?
Avatar billede bertelbrander Novice
06. april 2007 - 17:16 #6
Templates er gode til mange ting.
Indtil videre kan du bare bruge:

bool FromString(int& t, const std::string& aStr)
{
  std::stringstream SS(aStr);
  return SS >> t && SS.eof();
}
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