Probleme mit cout und cin
-
Naja hab das jetzt ma mitm Stringcopy gemacht.
Die ausgabe macht er aber trozdem nicht.
übrigens die Struktur ist eine globale Variable.
-
@Treva
Als erstes fällt mir mal auf, dass dein Strukturelement PIN zu klein deklariert ist. In 4 Zeichen bekommst du hald nicht 5 Zeichen rein ;). D. h. Du hast die Zahlen 1, 2, 3 und 4 und zusätzlich noch die '\0'. Das sind also 5 Zeichen und nicht nur 4. Die '\0' musst du immer miteinrechnen, wenn du die Größe eines Strings festlegst.Dann fällt mir noch auf, dass du immer mit 1 den Index eines Arrays beginnst. In C/C++ ist das aber ein wenig anders. Da beginnt der Index mit 0, d. h. Kunde[0] ist das erste Element in deinem Array und Kunde[4] das letzte Element. So verhält es sich bei allen Arrays auch bei denen, die du als Strukturelemente deklariert hast.
@flyingCoder
Das mit strncpy() hät ich auch gemacht
Allerdings hast du was entscheidendes vergessen. strncpy() hängt nicht automatisch das Stringendezeichen an, nur wenn es das Stringendezeichen auch gelesen hat, wird es kopiert. Wenn allerdings die übergebene maximale Länge erreicht wird, dann steht am Ende auch keine 0 ('\0').
-
Thx ich werd die deklaration im prog ma ändern.
/edit
Troz der änderungen funzt das net
ich häng ma den ganzen code an evtl,liegt der fehler woanders.#include <iostream.h> #include <process.h> #include <time.h> #include <dos.h> #include <stdio.h> #include <windows.h> #include <string.h> //Globale Variablen const int Anzahl = 5; struct Daten { char Vorname[10]; char Nachname[10]; char PIN[5]; char Kontonummer[8]; float Kontostand; char angelegt; }; Daten Kunde[Anzahl]; void PIN_anzeigen(); void PIN_erzeugen(); void KN_erzeugen(); void PIN_abfragen(); void Kundendaten_anlegen(); void Kundendaten_anzeigen(int); void Definiertedaten(); void main() { char wahl_1; char wahl_2; bool ende=0; int n=0; void Definiertedaten(); do { cout << " a => PIN-Nummern anzeigen " << endl; cout << " b => Neue Kundendaten angelegen " << endl; cout << " c => Daten eines Kunden anzeigen " << endl; cout << " d => Sparvertrag berechnen " << endl; cout << " e => Rentenzahlung berechnen " << endl; cout << " f => Hypothekendarlehen berechnen " << endl; cout << " g => Sparvertrag ausfuehren " << endl; cout << " h => Rentenzahlung ausfuehren " << endl; cout << " i => Hypothekendarlehen ausfuehren " << endl; cout << " j => Daten aller Kunden anzeigen " << endl; cout << " k => Programm beenden " << endl; cout << " Ihre Wahl => "; cin >> wahl_1; switch(wahl_1) { case'a' : PIN_anzeigen(); ende=1; break; case'b' : Kundendaten_anlegen(); ende=1; break; case'c' : Kundendaten_anzeigen(0); ende=1; break; /* case'd' : Spv_berechnen; break; case'e' : Rnz_brechenen; break; case'f' : Htd_berechnen; break; case'g' : Spv_ausfuehren; break; case'h' : Rnz_ausfuehren; break; case'i' : Htd_ausfuehren; break; case'j': Kundendaten_anzeigen(); break; */ case'k': cout << " Wollen Sie das Programm wirklich beenden ? " << endl; cout << " 1 => Ja" << endl << " 2=> Nein" << endl; cout << " Ihre Wahl => "; cin >> wahl_2; if(wahl_2==1) ende=1; else ende=0; break; default: cout << " Falsche Eingabe !!! Bitter Eigabe wiederholen " << endl; ende=1; break; } }while(ende!=0); //system("PAUSE"); } void PIN_anzeigen() { int i=0; do { i++; cout << i <<") Kontonummer => " << Kunde[i].Kontonummer[1] << " PIN => " << Kunde[i].PIN << endl; }while(i<=Anzahl); cout << endl; } void PIN_erzeugen(int i) { int n; char puffer; srand((unsigned)time(NULL)); for(n=0;n<=4;n++) { do { puffer=rand()%57; //puffer = puffer + 48; }while(puffer<48); Kunde[i].PIN[n]=puffer; } Kunde[i].PIN[n+1]='\0'; cout << " Ihr Pin ist => " << Kunde[i].PIN << endl; } void KN_erzeugen(int i) { int n=0; char puffer; srand((unsigned)time(NULL)); for(n=0;n<=7;n++) { do { puffer=rand()%57; //puffer = puffer + 48; }while(puffer<48); Kunde[i].Kontonummer[n]=puffer; } Kunde[i].Kontonummer[n+1]='\0'; cout << " Ihre Kontonummer ist => " << Kunde[i].Kontonummer << endl; } void Kundendaten_anzeigen(int i) { if(i==0) { PIN_abfragen(); } system("CLS"); cout << " Name : " << Kunde[i].Nachname << endl; cout << " Vorname : " << Kunde[i].Vorname << endl; cout << " Kontostand : " << Kunde[i].Kontonummer << endl; system("PAUSE"); } void Kundendaten_anlegen() { char wahl_3; do { cout << " Bitte waehlen sie einen Kundendatenspeicherplatz aus." << endl; cout << " Es sind " << Anzahl << " Kundendatenspeicherplaetze vorhaden " << endl; cout << " Ihre Wahl => "; cin >> wahl_3; if (Kunde[wahl_3].angelegt==1) { cout << " Kundendatenspeicherplatz schon belegt!!!!! " << endl; cout << " Bitte einen anderen Speicherplatz whaelen " << endl; } }while(Kunde[wahl_3].angelegt==1); PIN_erzeugen(wahl_3); KN_erzeugen(wahl_3); cout << " Bitte geben sie ihren Vornamen ein => "; cin >> Kunde[wahl_3].Vorname; cout << " Bitte geben sie ihren Nachnamen ein => "; cin >> Kunde[wahl_3].Nachname; Kunde[wahl_3].angelegt=1; Kundendaten_anzeigen(wahl_3); } void PIN_abfragen() { int i=0; int Kp; char KN_nummer[7]; char PIN_nummer[4]; cout << " Bitte geben sie die Kontonummer ein => "; cin >> KN_nummer; cout << " Bitte geben sie die zugehoerige PIN ein => "; cin >> PIN_nummer; do { i++; if(KN_nummer==Kunde[i].Kontonummer) { if(PIN_nummer==Kunde[i].PIN) { cout << " Konntonummer und PIN korekkt" << endl; Kp=1; } else { cout << " PIN Nummer Inkorekkt" << endl; Kp=0; } } else { cout << " Konntonummer nicht korekkt " << endl; Kp=0; } }while(i<=Anzahl); // TODO: Prozzi zum Überprüfen von KN und Pin schreiben } /* void Definiertedaten() { Kunde[1].Nachname[1] ='N'; Kunde[1].Nachname[2] ='o'; Kunde[1].Nachname[3] ='w'; Kunde[1].Nachname[4] ='o'; Kunde[1].Nachname[5] ='t'; Kunde[1].Nachname[6] ='n'; Kunde[1].Nachname[7] ='y'; Kunde[1].Nachname[8] ='\0'; Kunde[1].Vorname[1] = 'M'; Kunde[1].Vorname[2] = 'i'; Kunde[1].Vorname[3] = 'c'; Kunde[1].Vorname[4] = 'h'; Kunde[1].Vorname[5] = 'a'; Kunde[1].Vorname[6] = 'e'; Kunde[1].Vorname[7] = 'l'; Kunde[1].Vorname[8] = '\0'; Kunde[1].Kontonummer[1] ='1'; Kunde[1].Kontonummer[2] ='2'; Kunde[1].Kontonummer[3] ='3'; Kunde[1].Kontonummer[4] ='4'; Kunde[1].Kontonummer[5] ='5'; Kunde[1].Kontonummer[6] ='6'; Kunde[1].Kontonummer[7] ='7'; Kunde[1].Kontonummer[8] ='\0'; Kunde[1].PIN[1] ='1'; Kunde[1].PIN[2] ='2'; Kunde[1].PIN[3] ='3'; Kunde[1].PIN[4] ='4'; Kunde[1].PIN[5] ='\0'; Kunde[1].angelegt=1; // Kunde[2].Nachname[0]="Meusel"; } */ void Definiertedaten() { strncpy(Kunde[0].Nachname, "Nowotny", sizeof Kunde[0].Nachname); strncpy(Kunde[0].Vorname, "Michael", sizeof Kunde[0].Vorname); strncpy(Kunde[0].Kontonummer, "1234567", sizeof Kunde[0].Kontonummer); strncpy(Kunde[0].PIN, "1234", sizeof Kunde[0].PIN); Kunde[0].angelegt=1; }
hoffe ihr könnt mir helfen ich hoock seit ner weck dran und bekomms net hin.
Noch ne kleine frage.
Hat Viusall c++ v6 standart keine code einfärbung?
-
Ich zitiere mich gerne selber
AJ schrieb:
@flyingCoder
Das mit strncpy() hät ich auch gemacht
Allerdings hast du was entscheidendes vergessen. strncpy() hängt nicht automatisch das Stringendezeichen an, nur wenn es das Stringendezeichen auch gelesen hat, wird es kopiert. Wenn allerdings die übergebene maximale Länge erreicht wird, dann steht am Ende auch keine 0 ('\0').
-
Treva schrieb:
Noch ne kleine frage.
Hat Viusall c++ v6 stan**** keine code einfärbung?Doch?
-
#include <stdio.h> #include <string.h> int main () { char blubb[50]; strncpy (blubb, "ich bin ein bedeutungsloser string", sizeof blubb); puts (blubb); return 0; }
funzt aber wunderbar.
In meinem C-Buch (ich habe extra nochmal nachgeschlagen
) steht:
char *strncpy(s, ct, n): höchsten n Zeichen aus ct in s kopieren. Mit '\0' auffüllen, wenn ct weniger als n Zeichen hat.
-
Die Stelle, die entscheidend ist, habe ich untersrichen.
flyingCoder schrieb:
char *strncpy(s, ct, n): höchsten n Zeichen aus ct in s kopieren. Mit '\0' auffüllen, wenn ct weniger als n Zeichen hat.
D. h. wenn ct nicht weniger als n Zeichen hat, dann wird auch keine '\0' angehängt. :p
Das kannst du mir ruhig glauben. Ich hab das früher unfreiwillig schon erprobt ;).Teste mal das hier:
int main(void) { char buffer[10]; char text[50] = "--- Das hier sollte nicht erscheinen! ---"; strncpy(buffer, "Ein Text mit mehr als nur 10 Zeichen", sizeof(buffer)); printf("%s", buffer); return(0); }
-
Ich dachte "ct" hat weniger Zeichen als "n".
Aber wahrscheinlich verrenne ich mich gerade total
-
Ja leutz,
mein Problem
is halt das irgendwie die funktionen net auf die globalen Variablen schreiben könne.
Was aber doch eigentlich ohne Probleme möglich sein sollte? oder?
-
@Treva
Bist du dein Programm schon mit dem Debugger durchgegangen und hast dir die entsprechenden Variablen anzeigen lassen?
-
Sorry das ich so spät anworte aber ich versuch das schon seit vor deinen Post.
Aber ich komm mit der bedienung des Debbuger net klar.
Wenigstens funzt jetzt die definiertedaten funktion..
Tja man sollte die funktion im Programm halt net mit void Funtkionsname aufrufen^^