struct befehl richtig anwenden
-
Hi Leute!
Wie verwendet man eigentlich den struct Befehl richtig an??Beispielsweise wird zunächst gefragt, wieviele Kunden man anlegen möchte. Dann sollen diese deklariert werden und danach müssen die Daten hinterlegt und danach ausgegeben werden.
system("cls"); printf("Wieviele Benutzer wollen Sie anlegen?"); scanf("%i,auswahl"); struct daten { char name[40]; char vname[30]; }; for (i=1;i<=auswahl;i++) { struct daten kunde[i]; }
Jetzt bekomme ich aber schon hierbei ein Fehler. Wie macht man das genau in der For-Schleife???
Und wie muss ich das später machen, dass die Kundendaten gespeichert werden?MFG
staden4
-
du solltest dich eher erstmal fragen wie man scanf benutzt
aber naja um ein wenig konstruktiver zu sein .. hier ist mal ein ansatz ..
ich denke er sollte dir weiterhelfen ist aber nicht getestet....const int array_size_=40; int max_; scanf("%i",&max_);// bitte an den Adressoperator & denken // wozu ne lokale struktur ? struct daten{ char name[array_size_];// warum keine std::string s ?? char vname[array_size_];// " " " }; daten dat[max_]; //hier wird ein array mit max_ strukturen angelegt for(int i=0;i<max_;++i){ // hier sollte deine eingabe erfolgen strncpy(dat[i].name,"was auch immer",array_size_);// zugriff auf die einzelnen strukturen strncpy(dat[i].vname,"was auch immer",array_size_);//bzw ihre beiden strings } printf("%s",dat[0].name);// ausgabe // schema
-
shapeless schrieb:
daten dat[max_]; //hier wird ein array mit max_ strukturen angelegt
gcc erweiterung, kein standard
-
staden4 schrieb:
Hi Leute!
Wie verwendet man eigentlich den struct Befehl richtig an??Was ist denn ein Struct "befehl"?
Ein Struct ist eine Sammlung von Daten, in C++ darüber hinaus ist es ähnlich einer Klasse, und kann Methoden haben.
Da gibt es keine Befehle, genausowenig gibt es überhaupt jedweilige "Befehle" in C oder C++. Du meinst Funktionen oder Methoden.
-
struct ist C und wird von C++ Compilern wie eine klasse behandelt.Nur das Standard alle Membervariablen,Methoden public sind.
scanf und printf sind ebenfalls C. In C++ verwendet man die cin und cout stream klassen.
ungefähr so:class daten { private: string name; string vname; public: daten(string vorname,string nachname){vname=vorname;name=nachname;} ~daten(){} void set_name(string nachname){name=nachname;} void set_vname(string vorname){vname=vorname;} string get_name(){return name;} string get_vname(){return vname;} }; int main() { int auswahl; cin >> auswahl; vector <daten> dat; string vorname,nachname; for(int i=0;i<auswahl;++i) { cin >> vorname; cin >> nachname; dat.push_back(daten(vorname,nachname)); } cout << dat[0].get_vname() << " " << dat[0].get_name(); return 0; }
-
scanf und printf sind ebenfalls C. In C++ verwendet man die cin und cout stream klassen.
aha also kein c++ und deswegen gibts cstdio.....
mit ist klar dass es streams in c++ gibt doch sollte vll erstmal der threadstarter sagen warum er eben diese nicht benutzt hat...
struct ist C und wird von C++ Compilern wie eine klasse behandelt.Nur das Standard alle Membervariablen,Methoden public sind.
eben .. und warum sollte es dann C sein ....
//editshameless schrieb:
shapeless schrieb:
daten dat[max_]; //hier wird ein array mit max_ strukturen angelegt
gcc erweiterung, kein standard
hatte ich nicht gewusst aber dann natürlich
daten*dat=new daten[max_];
-
aha also kein c++ und deswegen gibts cstdio.....
*lol*
-
asak schrieb:
aha also kein c++ und deswegen gibts cstdio.....
*lol*
mir ist klar warum du lachst allerdings solltest du mal drüber nachdenken
ob eine Aussage wie
"ist kein c++" nicht leicht impliziert dass es kein gültiges c++ ist,
also entweder falsch oder nicht standartgerecht.
Aber es könnte natürlich schwer fallen die eigenen Formulierungen kritisch zu betrachten ....
-
Aber es könnte natürlich schwer fallen die eigenen Formulierungen kritisch zu betrachten ....
Es gibt nichts an der Aussage zu ändern:
[/quote]scanf und printf sind ebenfalls C.[quote]ist absolut eindeutig und was dagegen spricht alte C Libs und C++ zu vermischen solltest du eigentlich wissen.
-
Also ich muss das mit struct machen. Aber wenn ich das jetzt so kompiliere, kommt immer noch drei Fehler in der Zeile:
daten dat[auswahl];
- Konstanter Ausdruck erwartet
- Reservierung eines Arrays der konstanten Grösse 0 nicht möglich
- 'dat': Unbekannte Grössesystem("cls"); printf("Wieviele Benutzer wollen Sie anlegen?"); scanf("%i",&auswahl); struct daten{ char name[40]; char vname[30]; char strasse[50]; int hnummer; }; daten dat[auswahl]; for(i=0;i<auswahl;++i){ strncpy(dat[i].name,"was auch immer",40); strncpy(dat[i].vname,"was auch immer",40); }
Und anstatt
strncpy(dat[i].name,"was auch immer",40);
könnte ich dann auch einfach
dat[i].name="Hallo";
schreiben oder nicht??
MFG
-
asak schrieb:
Aber es könnte natürlich schwer fallen die eigenen Formulierungen kritisch zu betrachten ....
Es gibt nichts an der Aussage zu ändern:
[_quote]scanf und printf sind ebenfalls C.[_quote]ist absolut eindeutig und was dagegen spricht alte C Libs und C++ zu vermischen solltest du eigentlich wissen.
ich denke wir haben dann einfach unterschiedliche Ansichten wie man deine Aussage verstehen kann, aber ich denk das ist nicht weiter schlimm...
und ja ich denke ich kann den Gebrauch von C-libs einschätzen , versuche nur meist kein völlig neues Programm als Lösung anzubieten, sondern auf die Fehler einzugehen.
-
daten dat[auswahl];
geht nicht. Siehe oben( gcc erweiterung )
dat[i].name="Hallo";
geht nur wenn du daten.name als string deklarierst( siehe oben )
-
shapeless schrieb:
daten *dat=new daten[max_];
sollte dann doch deine anforderungen erfüllen.
-
wie mache ich das dann, dass ich Beispielsweise in der For-Schleife die NAmen angegeben muss?
for(i=0;i<auswahl;++i){ printf("Name des %i.Benutzers: "); scanf("%c",&daten[i].Name); }
So funktioniert das bei mir nich...
-
Meine natürlich:
for(i=0;i<auswahl;++i){ printf("Name des %i.Benutzers: ",i); scanf("%c",&dat[i].Name); }
-
Name ist ein char *, nicht wahr ( bin zu faul den ganzen thread nochmal zu lesen, es ist furchtbar heiss heute ).
dann solltest du auch "%s" im scanf verwenden.
Kurt
-
staden4 schrieb:
Also ich muss das mit struct machen. Aber wenn ich das jetzt so kompiliere, kommt immer noch drei Fehler in der Zeile:
daten dat[auswahl];
- Konstanter Ausdruck erwartet
- Reservierung eines Arrays der konstanten Grösse 0 nicht möglich
- 'dat': Unbekannte Grössedie fehlermeldung resultiert daraus, dass du möchtest, dass jemand eine arraygrösse eingibt. nun ist die regel einfach so, dass ein array mit einer konstanten starten muss.
- Konstanter Ausdruck erwartet
deine variable ist nicht konstant.- Reservierung eines Arrays der konstanten Grösse 0 nicht möglich
da zur laufzeit noch nicht initialisiert- 'dat': Unbekannte Grösse
grösse kann nicht bestimmt werden.schon mal sowas probiert
itemtype dat[] = {0}; und danach redimensionieren, wenn du weisst, wie gross es werden soll?
-
ZuK schrieb:
Name ist ein char *, nicht wahr ( bin zu faul den ganzen thread nochmal zu lesen, es ist furchtbar heiss heute ).
dann solltest du auch "%s" im scanf verwenden.
Kurtmach eine klasse, wie das beispiel oben! und dann benutzt du ein anwendungsprogramm, dass die entsprechenden funktionen aufruft.
-
#include <cstdlib> #include <iostream> using namespace std; #define MAX 100; class daten { private: string name; string vname; public: daten(string vorname="Max", string nachname="Muster"){vname=vorname;name=nachname;} ~daten(){} void set_name(string nachname){name=nachname;} void set_vname(string vorname){vname=vorname;} string get_name(){return name;} string get_vname(){return vname;} }; int main(int argc, char *argv[]) { daten dat[100]; string n, v; char choice; for (int i = 0; i < 100; i++) { cout << "Person " << i << endl; cout << "Geben Sie einen Vornamen ein: "; cin >> v; dat[i].set_vname(v); cout << "Geben Sie einen Nachnamen ein: "; cin >> n; dat[i].set_name(n); cout << "weitere person eingeben? (j/n)" << endl; cin >> choice; if (choice == 'n') break; } for (int j = 0; j < 100; j++) cout << dat[j].get_name() << ", " << dat[j].get_vname() << endl; system("PAUSE"); return EXIT_SUCCESS; }
-
wuschelz schrieb:
ZuK schrieb:
Name ist ein char *, nicht wahr ( bin zu faul den ganzen thread nochmal zu lesen, es ist furchtbar heiss heute ).
dann solltest du auch "%s" im scanf verwenden.
Kurtmach eine klasse, wie das beispiel oben! und dann benutzt du ein anwendungsprogramm, dass die entsprechenden funktionen aufruft.
es wurde schon gesagt dass er struct benutzen soll....
aber er kann ja auch auf die stream funckionen und vor allem auch auf nen std::string zurückgreifen wie es ja auch schon am anfang gesagt wurde..
insofern er das denn darf und er ggf nich wirklich nen C-programm schreiben soll.
dies kann aber nur der threadstarter angeben.....