gemischte Strings in char und int zerlegen
-
Hallo Leute,
ich habe ein string, von welchem ich aber nur den int-Teil haben möchte.
Auf Windows hat die Funktion atoi() super geklappt, die mir nur den int-Wert ausgibt, aber unter Linux funktioniert es nicht mehr

Wisst ihr Rat ?
int main(){ char bla[255] = "20 ms"; int blu = atoi(bla); cout << blu << endl; return 0; }so hab ich es getestet, aber in meinem realen Projekt benutze ich die Timer-Klasse und bekomme ja im folgenden das TimerObjekt zurück, da funktioniert das nicht mehr

timer.cpp
std::ostream& operator<<(std::ostream& os, const timer &t) { unsigned long ns = (t.ts_end.tv_sec - t.ts_start.tv_sec) * 1000000000 + t.ts_end.tv_nsec - t.ts_start.tv_nsec; std::string ext = "ns"; if (ns >= 1000) { ns /= 1000; ext = "us"; } if (ns >= 1000) { ns /= 1000; ext = "ms"; } if (ns >= 1000) { ns /= 1000; ext = "s"; } os << ns << " " << ext; return os; }timer.h
class timer { struct timespec ts_start, ts_end; clockid_t id; public: timer(clockid_t clock = CLOCK_MONOTONIC) { id = clock; } void start() { clock_gettime(id, &ts_start); } void stop() { clock_gettime(id, &ts_end); } friend std::ostream & operator<<(std::ostream& os, const timer &t); };main.cpp
int main(){ timer upps; upps.start(); // tu irgendetwas upps.stop(); int time_value = atoi(upps); return 0; }Fehlercode im Linux:
error: cannot convert 'timer' to 'const char*' for argument '1' to 'int atoi(const char*)'
-
timerist kein C-String (das möchte atoi als Argument haben) sondern ein anderer Typ.Schau dir Zeile 3 von timer,cpp an, dann weißt du, wie man das berechnet.
-
Hallo,
es tut mir leid, aber ich stehe immernoch auf dem Schlauch.
Selbst mit Getter Methoden, kann ich mit den Daten nicht so rechnen, wie ich es gern hätte.
Könntest du mir das ausführlich erklären ?
-
Mir ist unklar wieso du den Umweg über Strings gehen möchtest. Deine Klasse hat doch bereits die benötigten Werte vorliegen. Kannst ja beispielsweise so eine Funktion einbauen:
unsigned long timer::get_ns() const { return (t.ts_end.tv_sec - t.ts_start.tv_sec) * 1000000000 + t.ts_end.tv_nsec - t.ts_start.tv_nsec; }Mit dem Rückgabewert kannst du dann nach belieben rechnen. Wenn du wirklich den Zahlenwert vor der Einheit haben willst kannst du das ja auch als Funktion machen, die ähnlich wie dein
operator<<aufgebaut ist.
-
hi,
ja klar .... hätte ich auch selbst drauf kommen können

Danke dir.