Aufgaben aus der Schule; char [gelöst]
-
Guten morgen allerseits,
da ich in meiner Ausbildung wider erwarten im Fach Anwendungsentwicklung unterrichtet werde (und meine miesen Programmier-Skills dafür nicht reichen) habe ich mich mal hier angemeldet.
Ich hoffe ihr könnt mir mit der Aufgabenstellung helfen.Hier das Problem:
Wir sollen ein Programm schreiben, bei dem ein Nachname und ein Vorname in jeweils einer char Variable gespeichert werden. <= Das war noch der leichte Teil.
Für die spätere Ausgabe jedoch sollen beide char-Variablen in EINE char kopiert werden. Falls das nicht klar genug ist "Name = Vorname + Nachname".
Ich hab die ganze Sache jetzt auf verschiedene Arten probiert, habe aber lediglich hinbekommen das beim Kompilieren kein Fehler mehr angezeigt wird.
Bei der Ausgabe fehlt dann der vollständige Name, die dritte char-Variable ist leer.Kann mir irgendjemand mit dem Problem helfen. Wenn nötig kann ich auch meinen bisherigen Code posten. Sollten ansonsten noch Infos nötig sein reiche ich die auf Wunsch gerne nach.
Danke im Voraus,
lg
Shruikan
-
Deinen Code solltest du schon posten.
Ist der Typ char bzw. char* Pflicht? Falls nicht, kannst du es ganz einfach mit der Klasse std::string machen (da funktioniert dann auch Vorname+Nachname). Falls du mit char-Arrays arbeiten musst, kannst du z.B. sprintf oder strcat benutzen, um deine beiden Strings zusammenzufügen.
-
Na dann poste ich mal meinen Code. Als Antwort auf deinen Post:
Ja wir sollen Char benutzen (warum auch immer).
Diese Geschichte mit char*, char...
Sorry davon haben wir im Unterricht noch nichts gehört.Aber hier erstmal meinen Code:
#include <cstdlib>
#include <iostream>using namespace std;
int main(int argc, char *argv[])
{
system("COLOR F0"); //Definition der Farbechar name[20];
char vorname[20]; //Deklaration der Variablen
char gesamt[40]; //Gesamtvariable
char abfrage; //Variable zur Abfrage der Gültigkeit der Eingabewhile(abfrage !='j')
{
cout <<"Geben Sie einen Nachnamen ein: ";
cin >> name;
cout <<"Geben Sie einen Vornamen ein: ";
cin >> vorname;
cout << endl << endl;
cout <<"Ihr eingegebener Name lautet "<< name << endl;
cout <<"Ihr eingegebener Vorname lautet "<<vorname << endl << endl;
cout <<"Sind diese Eingaben korrekt?" <<endl;
cout <<"W„hlen Sie j wenn die Eingaben korrekt sind"<<endl;
cout <<"W„hlen Sie n wenn die Eingaben falsch sind"<<endl << endl;
cin >> abfrage;
cout << endl;
}
gesamt == vorname && name;
cout <<"Ihr vollst„ndiger Name lautet" << gesamt << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}Hoffe das hilft weiter. Falls ich nicht direkt antworte tuts mir leid, aber ich kann hier nur sporadisch reingucken.
-
1. std::strncpy ist dein Freund
2. Sag deinem Lehrer das das Bullshit ist und man seit langer Zeit std::string statt char-Arrays verwendet.
-
Fellhuhn schrieb:
1. std::strncpy ist dein Freund
Ich bin kein C-Progger aber generell glaub ich zusätzlich auch: (???)
http://www.cplusplus.com/reference/clibrary/cstring/strncat/
und natürlich
http://www.cplusplus.com/reference/clibrary/cstring/strlen/
wobei man letzteres eigentlich als Kenntnis voraussetzen kann (wie Fellhuhn es getan hat)
Fellhuhn schrieb:
2. Sag deinem Lehrer das das Bullshit ist und man seit langer Zeit std::string statt char-Arrays verwendet.

-
Oder aber- was ich für wahrscheinlicher halte- der Weg soll das Ziel sein und nicht die Verwendung möglichst einfacher Klassen/Funktionen.
Ich gehe davon aus, dass eine strncat-Funktion selber geschrieben werden soll.
-
Was du lernen musst ist, dass die char-Arrays, die du verwendest ("char meinArray[50]"), nicht den String-Typen anderer Sprachen entsprechen. Daher kannst du die auch nicht einfach addieren.
char a[20]; //das sind Arrays vom Typ char char b[20]; // char c[50]; // a="Hallo "; //geht nicht! strncpy(a,"Hallo ",20); //klappt schon besser! strncpy(b,"Welt!",20); c=a+b; //Nö... hier würdest du nicht die Inhalte/Strings von a+b addieren, //sondern deren Adressen (schlag vielleicht mal array-to-pointer-decay nach) //Daher gibt's hier auch einen Fehler (du kannst 2 Zeiger nicht addieren) _snprintf(c,50,"%s%s",a,b); //schon besser. Hier werden die Strings, auf die //a und b zeigen, in c zusammengeführt.
-
Und dann noch was hierzu:
gesamt == vorname && name;Sorry, aber das ist so falsch, wie es nur sein kann!

Du hast wohl krampfhaft versucht, die Compiler-Fehler wegzubekommen. Aber "==" ist der Vergleichsoperator, nicht der Zuweisungsoperator. Und "&&" ist ein logisches Und, kein Addieren oder Zusammenführen, wie du es vorhattest.
Du bildest hier einfach ein boolsches Ergebnis, dass nicht weiter ausgewertet wird. Genauso hättest du auch eine solche Zeile notieren können:
1;
-
wie gesagt, programmieren in einer FISI Ausbildung stößt fast überall (auch bei mir) auf unverständnis.
Um jetzt zu den string-lösungen zu kommen die erwähnt wurden.
Ich sagte meinem Lehrer schon das es so meiner Meinung nach schrott ist.
(Aber der schreibt auch Widerstand mit "ie")Frage ist jetzt wie ich das Programm funktionsfähig UND richtig codiere.
Bin für den restlichen Tag jetzt unterwegs, lasst euch also ruhig Zeit mit den Antworten.Lg und danke für die bisheringen Posts
-
Shruikan schrieb:
Frage ist jetzt wie ich das Programm funktionsfähig UND richtig codiere.
Bin für den restlichen Tag jetzt unterwegs, lasst euch also ruhig Zeit mit den Antworten.Eine Möglichkeit habe ich dir schon gezeigt. Die Frage ist eher, was genau du machen sollst. Wenn lediglich die Datentypen (char-Array) und das Ziel definiert sind, kannst du mit meiner Methode arbeiten (eine Alternative wäre noch strncat statt _snprintf). Wenn - wie schon vermutet wurde - ein strcat/strncat nachprogrammiert werden soll, musst du das bitte sagen.
-
strncat und snprintf sagt mir beides NICHTS, sorry.
Aufgabenstellung unseres Lehrers lautet wortgemäß
"Codiere ein Programm bei dem Vorname und Nachname in jeweils einer eigenen char Variable abgespeichert werden. Für die Ausgabe sollen die Werte aus den beiden chars in eine dritte char kopiert werden"Wir haben daraufhin in der Schule schonmal nach einem befehl wie "copy" gesucht, aber nichts gefunden. Also muss die Lösung anders aussehen.
Hoffe das gibt jetzt aufschluss.
LG
-
Shruikan schrieb:
Aufgabenstellung unseres Lehrers lautet wortgemäß
"Codiere ein Programm bei dem Vorname und Nachname in jeweils einer eigenen char Variable abgespeichert werden. Für die Ausgabe sollen die Werte aus den beiden chars in eine dritte char kopiert werden"Ich hoffe, dass das nicht wirklich "wortgemäß" widergegeben ist. Bringt euch der Hausmeister programmieren bei?

-
Shruikan schrieb:
strncat und snprintf sagt mir beides NICHTS, sorry.
CSpilles Links gesehen?
Shruikan schrieb:
Aufgabenstellung unseres Lehrers lautet wortgemäß
"Codiere ein Programm bei dem Vorname und Nachname in jeweils einer eigenen char Variable abgespeichert werden. Für die Ausgabe sollen die Werte aus den beiden chars in eine dritte char kopiert werden"Mein Beileid. Wenn jemand einen String als "char-Variable" bezeichnet, lässt das schon mal stark an seiner Kompetenz zweifeln.
-
wortgemäß, wie gesagt.
(auf die idee das er in wahrheit nur der hausmeister ist sind wir noch nicht gekommen wir haben bisher immer anderes getippt.
-
Wenn du konfrontativ sein willst, sagst du ihm, dass man in einer char-Variable nur ein einziges Zeichen speichern kann und deshalb die Aufgabe nicht lösbar ist.
Zumindest nicht für übliche Namen.
-
konfrontativ spare ich mir lieber, habe dies jahr schon statt 3 ne 4 bekommen

heißt also ich müsste strings verwenden um die aufgabe zu lösen?habe jetzt mal zwei beispiele aus besagten Links ausprobiert, aber die sind beide auch mit strings.
ich denke ich werd das erstmal so an den guten mann weitergeben.
Lösung wie er sie sich vorstellt werd ich danngerne hier posten.(vielleicht meinte er ja strings und sagte char)
wird jedenfalls nicht mein letzter Beitrag hier sein.
Bis zum nächsten Problem dann.
-
Überall in der Schule gesucht und nirgendwo ein Copy gefunden? (Tipp: der Lehrer hat es in der Schublade vom Pult eingesprerrt.)
Spatz beiseite: mach Dir Dein char-Arry-Copy doch selber:
char vorname[20]; char nachname[20]; char name[42]; // Einlesen ... cin >>... // Konkatenieren int pos_name=0; for(int pos_vn=0; vorname[pos_vn]!=0 && pos_vn<20; ++pos_vn) name[pos_name++]=vorname[pos_vn]; name[pos_name++]=' '; //Leerzeichen dazwischen for(int pos_nn=0; nachname[pos_nn]!=0 && pos_nn<20; ++pos_nn) name[pos_name++]=nachname[pos_nn]; name[pos_name]='0'; // Vorsicht in der PorzellankisteSicher nicht die schönste Lösung, aber sollte grob tun

Angestrebter Lerneffekt: Strings als Null-terminierte Char-Arrays (klassische C-Strings) selbst verwurschdeln.Zusatzaufgabe für Übermotivierte: Zeiger-Arithmetik statt Feld-Indizes verwenden!
-
hm, dafür das der post nicht lang ist hast du es geschafft mich während der geschätzen minute die ich zum lesen brauchte komplett zu verwirren

heißt das (übersetzt für alle wie mich) das ich einen copy befehl selbst erstellen könnte wenn ich den code aus deinem post entnehme?
-
Shruikan schrieb:
hm, dafür das der post nicht lang ist hast du es geschafft mich während der geschätzen minute die ich zum lesen brauchte komplett zu verwirren

lol ja bei solchen kommentaren
löl schrieb:
//Konkatenieren
//Vorsicht in der Porzellankistekein wunder

-
evtl mal eine variante mit strcat
char vorname[]="vorname"; char nachname[]="nachname"; char name[42]={0}; strcat(name,vorname); strcat(name," "); strcat(name,nachname); cout << name << endl;ist zwar viel? langsamer aber dafür kürzer