Paramter verarbeiten
-
Ich bin nach mehr als 20 Jahren C-Pause also blutiger Anfänger und versuche wieder einzusteigen in C++, nachdem ich UBUNTU kennengelernt habe und WINDOWS beerdigt habe. An der ersten Hürde kaue ich seit 2 Tagen.
Wie übergebe ich numerische Parameter.#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main(int argn, char *argv[])
{
int x;
string k;
k=argv[1];
//x = atoi(k); zunächst AUSGESCHALTET
cout << "argn " << ":" << argn << endl;
cout << "k " << ":" << k << endl;
for(int j=0; j < argn; j=j+1)
{
cout << "argv " << ":" << argv[j] << endl;
cout << "k " << ":" << k << endl;
cout << "x " << ":" << x << endl;
}
}Ergebnis:
./CPROGS/BSP 5 70
k :5
x :-1218330636
argn :3
k :5
argv :./CPROGS/BSP
argv :5
argv :70Ich will jedoch Parameter 1 (also 5) als int x verwenden, also x = atoi(k);
Da streikt schon der Compiler:
Speicherzugriffsfehler (Speicherabzug geschrieben)Was mach ich also falsch.
-
argv[1] ist ein char* und kein string
atoi erwartet ein char* und keinen stringx = atoi(argv[1]);
-
wer stürzt ab? Der Compiler oder dein Programm?
Mit C++11 sollte es so gehen
#include <string> ... std::string val = "5";// bei dir argv[1] int x = std::stoi( val );g++ --std=c++0x ...
-
Wenn man die C++11-Funktionen nicht verwenden will, dann kann man immernoch gut mit stringstreams arbeiten.
#include <sstream> std::stringstream stream; stream<<argv[1]; int zahl; stream>>zahl;EDIT: Auch wenn das nicht dein Problem ist: Dein Programm verlangt zur Zeit mindestens einen Parameter, der Fall dass nur einer angegeben wird, sollte unbedingt abgefangen werden, auch wenn da nur mit einer Fehlermeldung reagiert wird.
-
Ja oder man könnte auch einfach
.c_str()hinten dran schreiben:x = atoi(k.c_str()); // tadaaaWarum der Compiler hier ohne
.c_str()nen Schnellzug baut wäre aber auch interessant.ps: das Programm darf bei Ausführung natürlich crashen, denn es fehlt ja der
argccheck. Wenn man also keine Parameter mitgibt, dann kann es schonmal beim Zugriff aufargv[1]crashen, oder auch gerne im Konstruktor desstd::string(dem man dummerweise keine Nullpointer übergeben darf).
-
hustbaer schrieb:
x = atoi(k.c_str()); // tadaaad.h. da würde dann stehen
int main(int argn, char *argv[]) { std::stringstream stream; stream << argv[1]; string k; stream >> k; int x = atoi(k.c_str()); // ... }
-
Nein.
Guckst du ersten Beitrag in diesem Thread.