Buffer ist zu klein troz dynamischem anlegen
-
Hallo zusammen,
ich versuche mich zur Zeit an einigen Aufgaben in C++ um das Buch welches ich lese an weiteren sachen an zu wenden um es besser zu vrstehen. Momentan bin ich bei Konstruktoren (KopierK. 7 KonvertierK) und dem Dynamischn nlegen von Speicher
Mein folgendes Problem ist das ich eine Fehlermeldung bekomme mit " Buffer is to low" obwohl ich bei strcpy_s doch die Größe mit strlen() ermittel. Leider bekomme ich keine weiteren Meldungen und beim Debuggen fehlt mir die erfahrung um den Fehler zu ermitteln.Daher wollte ich euch um Rat fragen, was ich momentan falsch mache. Eigendlich komme ich aus der C Richtung und C++ ist noch nicht ganz so mein Freund

Ausschnitt Kunde.hpp
class Kunde{ char *name; char *ort; int alter; double umsatz; int transaktion; int id; static int anzahl; public: Kunde(const char *name="Kein Name", const char *ort="Kein Ort", const int alter=0); Kunde(const Kunde &src); ~Kunde(); void kaufe(double u); static int getAnzahl(); void print(); };Ausschnitt Kunde.cpp
#include "Kunde.hpp" #include <iostream> #include <cstring> #define use_CRT_SECURE_NO_WARNINGS using namespace std; int Kunde::anzahl = 0; Kunde::Kunde(const char *name, const char *ort, const int alter){ this->name = new char[strlen(name) + 1]; strcpy_s(this->name,strlen(name), name); this->ort = new char[strlen(ort) + 1]; strcpy_s(this->ort, strlen(ort), ort ); this->alter = alter; this->umsatz = 0; this->transaktion = 0; this->id = ++Kunde::anzahl; } Kunde::Kunde(const Kunde &src){ this->name = new char[strlen(src.name) + 1]; strcpy_s(this->name, strlen(src.name), src.name ); this->ort = new char[strlen(src.ort) + 1]; strcpy_s(this->ort, strlen(src.ort), src.ort ); this->alter = src.alter; this->umsatz = 0; this->transaktion = 0; this->id = ++Kunde::anzahl; } Kunde::~Kunde(){ delete name; delete ort; } void Kunde::kaufe(double umsatz){ this->umsatz += umsatz; this->transaktion; } int Kunde::getAnzahl(){ return Kunde::anzahl; } void Kunde::print(){ cout << "Kunde " << name << " aus " << ort << " (ID = " << id << ", " << alter << "Jahre) hatte " << transaktion << " Transaktion(en) und " << umsatz << " Euro Umsatz." << endl; }Ausschnitt main.cpp
#include "kunde.hpp" #include <iostream> using namespace std; int main() { Kunde a("Kunde 1"); Kunde meiera("Meier", "Esslingen", 28); a.print(); meiera.print(); }
-
Code nicht gelesen. Nimm
std::string!
-
strlen(x) < (strlen(x) + 1)
-
OMG

sorry ich glaube ich brauche ine Pause...aber danke!
-
Hör' auf Swordfish.
-
Schauder schrieb:
Hör' auf Swordfish.
Ist doch wahr. Hat ein falsches delete im Destruktor, assignment operator fehlt und unnötiges langsames zweifaches Berechnen der Stringlänge. Diese Fehler und der aktuelle wären nicht passiert, wenn er std::string verwendet hätte. Und der Code wäre wesentlich kürzer.
BTW @TE: Kennst du Initialisierungslisten für Konstruktoren?
-
#include <string> class Kunde { std::string name; std::string ort; int alter; double umsatz; int transaktion; int id; static int anzahl; public: Kunde(const std::string & name = "Kein Name", const std::string & ort = "Kein Ort", const int alter = 0); Kunde(const Kunde &src); void kaufe(double u); static int getAnzahl(); void print() const; }; #include "Kunde.hpp" #include <iostream> int Kunde::anzahl = 0; Kunde::Kunde(const std::string & name, const std::string & ort, const int alter) : name(name), ort(ort), alter(alter), umsatz(0), transaktionen(0), id(Kunde::anzahl++) {} Kunde::Kunde(const Kunde &src) : name(src.name), ort(src.ort), alter(src.alter), umsatz(0), transaktionen(0), id(Kunde::anzahl++) {} void Kunde::kaufe(double umsatz) { this->umsatz += umsatz; } int Kunde::getAnzahl() { return Kunde::anzahl; } void Kunde::print() const { cout << "Kunde " << name << " aus " << ort << " (ID = " << id << ", " << alter << "Jahre) hatte " << transaktion << " Transaktion(en) und " << umsatz << " Euro Umsatz." << endl; } #include "kunde.hpp" int main() { Kunde a("Kunde 1"); Kunde meiera("Meier", "Esslingen", 28); a.print(); meiera.print(); return 0; }Ich habs grad einfach mal etwas aufgepeppt. Ich hoffe du stimsmt mir zu, dass das weit einfacher ist als dein Versuch mit dem Speicherverwalten.
-
Kohlerer schrieb:
// ... double umsatz; // ...Yay! again

~captcha: Cholera~
-
Ja, Moneyz und Gleitkommazahlen...
-
Nathan schrieb:
Schauder schrieb:
Hör' auf Swordfish.
Diese Fehler und der aktuelle wären nicht passiert, wenn er std::string verwendet hätte. Und der Code wäre wesentlich kürzer.
BTW @TE: Kennst du Initialisierungslisten für Konstruktoren?
und die Lernkurve wäre flacher. Leute, das ist eine ÜBUNG zur Speicherverwaltung.
-
mgaeckler schrieb:
Nathan schrieb:
Schauder schrieb:
Hör' auf Swordfish.
Diese Fehler und der aktuelle wären nicht passiert, wenn er std::string verwendet hätte. Und der Code wäre wesentlich kürzer.
BTW @TE: Kennst du Initialisierungslisten für Konstruktoren?
und die Lernkurve wäre flacher. Leute, das ist eine ÜBUNG zur Speicherverwaltung.
Ups, hab das nicht gesehen. Sorry.
-
Nathan schrieb:
Schauder schrieb:
Hör' auf Swordfish.
Ist doch wahr...
Kann es sein, daß Du hier ein Komma hineininterpretierst, das nicht da ist?
Ich schrieb eindeutig, daß er auf Swordfish hören soll.
-
Schauder schrieb:
Nathan schrieb:
Schauder schrieb:
Hör' auf Swordfish.
Ist doch wahr...
Kann es sein, daß Du hier ein Komma hineininterpretierst, das nicht da ist?
Jup.
Könnte schwören da stand ein Komma. Lag vermutlich am ', das ist dann im Kopf verrutscht. Hätte den Post nicht nebenbei schreiben sollen.
-
mgaeckler schrieb:
[...] Leute, das ist eine ÜBUNG zur Speicherverwaltung.
Dann, @Kohlerer, schreib' eine Stringklasse ...