strcpy/strncpy verschiedener variablen liefert den selben Wert?
-
Guten Tach auch, ich schon wieder!
und zwar liefert:
string eingabe; string str1, str2, str3, str4; string substr1; string substr2; string substr3; size_t pos1; size_t pos2; size_t pos3; size_t pos4; std::ifstream fin(fileNameIn); // zum Lesen oeffnen for (int i = 0;i<=GetCDTracks();i++) { if (!fin) { std::cout << "Die Datei konnte nicht geoeffnet werden!" << std::endl; } std::getline(fin,eingabe); std::cout << eingabe; std::cout << std::endl << "*******************************" << std::endl; fin.close(); pos1 = eingabe.find(";"); str1 = eingabe.substr (0,pos1); substr1 = eingabe.substr(pos1+1); pos2 = substr1.find(";"); str2 = eingabe.substr(pos1+1,pos2); substr2 = substr1.substr(pos2+1); pos3 = substr2.find(";"); str3 = eingabe.substr(pos2+1+pos1+1,pos3); substr3 = substr2.substr(pos3+1); pos4 = substr3.find(";"); str4 = eingabe.substr(pos1+1+pos2+1+pos3+1,pos4); } std::cout << "**********************************************" << std::endl; std::cout << "EingabeOrg: " << eingabe << std::endl; std::cout << "substring1: " << substr1 << std::endl; std::cout << "Substring2: " << substr2 << std::endl; std::cout << "Substring3: " << substr3 << std::endl; std::cout << "**********************************************" << std::endl; std::cout << "String1: " << str1 << std::endl; std::cout << "String2: " << str2 << std::endl; std::cout << "String3: " << str3 << std::endl; std::cout << "String4: " << str4 << std::endl; std::cout << "**********************************************" << std::endl; /************************************************************************************/ strncpy(Interpret,str1.c_str(),80); strncpy(Titel,str2.c_str(),80); /************************************************************************************/ std::stringstream hilfsTracks; std::stringstream hilfsTime; hilfsTime << str4; hilfsTime >> Time; hilfsTracks << str3; hilfsTracks >> Tracks; SetCDData(Interpret,Titel,Time,Tracks); }folgendes:
============================================ CD-Infos: ============================================ Interpret: Arctic Monkeys Titel : Arctic Monkeys Tracks : 3 Spielzeit: 123 ============================================funktion zur ausgabe:
void classCD::ShowCDData() { std::cout << std::endl; std::cout << "============================================" << std::endl; std::cout << "CD-Infos: " << std::endl; std::cout << "============================================" << std::endl; std::cout << " Interpret: " << GetCDInterpret() << std::endl; std::cout << " Titel : " << GetCDTitel() << std::endl; std::cout << " Tracks : " << GetCDTracks() << std::endl; std::cout << " Spielzeit: " << GetCDTime() << std::endl; std::cout << "============================================" << std::endl; std::cout << std::endl; }jemand ne ahnung warum das passiert, dass nach dem strcpy und auch strncpy, str1 und str2 jeweils den selben wert haben?
Danke schonmal...
(dass der code nicht optimal ist weiß ich, leider
)
-
pos1 = eingabe.find(";"); str1 = eingabe.substr (0,pos1); substr1 = eingabe.substr(pos1+1); pos2 = substr1.find(";"); str2 = eingabe.substr(pos1+1,pos2); substr2 = substr1.substr(pos2+1); pos3 = substr2.find(";"); str3 = eingabe.substr(pos2+1+pos1+1,pos3); substr3 = substr2.substr(pos3+1); pos4 = substr3.find(";"); str4 = eingabe.substr(pos1+1+pos2+1+pos3+1,pos4);Die Logik hier ist falsch. ZB ist pos1 relativ zu eingabe, pos2 jedoch relativ zu substr1. Wenn du eingabe.substr(pos1+1,pos2) aufrufst, kann da kein vernünftiges Ergebnis rauskommen. Ich würde es eher wie folgt machen:
pos1 = eingabe.find(";"); str1 = eingabe.substr (0,pos1); substr1 = eingabe.substr(pos1+1); pos2 = substr1.find(";"); str2 = substr1.substr(0,pos2); substr2 = substr1.substr(pos2+1); pos3 = substr2.find(";"); str3 = substr2.substr(0,pos3); substr3 = substr2.substr(pos3+1); pos4 = substr3.find(";"); str4 = substr3.substr(0,pos4);
-
Oder die ganzen substr's weglassen (du kannst der Methode substr() als zweiten Parameter auch die Länge des zu kopierenden Teilstrings mitgeben).
-
Guten Morgen Ihrse!
@groovemaster: bringt leider keinerlei Änderung...
@CStoll: Die Länge des Strings ändert sich immer wieder, deswegen brauch ich die Suche nach den Semikolons...Es wundert mich einfach nur, dass in der Ausgabe davor die Werte stimmen, aber nach der Zuweisung nicht mehr. Erinnert mich irgendwie an "fflush(stdin);" da konnte sowas ja auch vermieden werden, zumindest bei STDIN's...
-
Maguuu schrieb:
@CStoll: Die Länge des Strings ändert sich immer wieder, deswegen brauch ich die Suche nach den Semikolons...
Wie gesagt: substr() hat zwei Parameter:
pos1 = eingabe.find(";"); str1 = eingabe.substr (0,pos1); pos2 = eingabe.find(";",pos1+1);//Suche hinter pos1 fortsetzen str2 = eingabe.substr(pos1+1,pos2-pos1); ...Ansonsten: Wo (und wie) sind eigentlich die Variablen 'Interpret' und 'Titel' definiert? Und warum verwendest du dafür überhaupt char-Arrays?
-
Was genau sind denn die Variablen Interpret und Titel? Zeigen die womöglich auf denselben Speicherbereich?
-
Das ganze ist ein Programm mit dem ich angefangen habe C++ zu lernen und am Anfang hab ich noch nicht mit der String-Klasse gearbeitet.
Wäre es in dem Fall sinnvoll von vornherein die Variablen als String zu definieren oder weiter nach einer Lösung zu suchen...?!
Steh gerade echt auf dem Schlauch
-
Auf jeden Fall (und eigentlich sind die Variablen sowieso überflüssig - du kannst str1 und str2 auch direkt als Parameter weitergeben).
-
Das ganze ist glaub ich, in meinem Fall, nicht so einfach, der Quelltext ist wirklich nur ein Auszug, die komplette Geschichte besteht mittlerweile aus 7 files.
Titel, Interpret, Tracks, Time sind bereits definiert und haben auch entsprechende Get- und Set-Funktionen.wenn ich die strings als parameter übergebe geschieht folgendes...ich versteh ja auch warum, aus diesem grund wollte ich ja die konvertierung...narf...ich werd zum sabbernden lappen hier

:: === CDVerwaltung, Debug ===
E:\Entwicklung\AS-Entwicklung\Softwareentwicklung\Projekte\CDVerwaltung\classCD.cpp:198: error: no matching function for call to `classCD::SetCDData(std::string&, std::string&, std::string&, std::string&)'
E:\Entwicklung\AS-Entwicklung\Softwareentwicklung\Projekte\CDVerwaltung\classCD.cpp:103: note: candidates are: void classCD::SetCDData(const char*, const char*, short int, short int)
E:\Entwicklung\AS-Entwicklung\Softwareentwicklung\Projekte\CDVerwaltung\classCD.cpp:96: note: void classCD::SetCDData()
:: === Build finished: 3 errors, 0 warnings ===
-
Time und Tracks waren schon in Ordnung. Ändere einfach SetCDData so um, dass die ersten beiden Parameter den Typ const std::string& haben
-
Optimale Lösung: Stell dein gesamtes Projekt von char* auf std::string um (das kann ein wenig dauern, aber es lohnt sich).
Schnelle Lösung:
SetCDData(str1.c_str(),str2.c_str(),Time,Tracks);(die Methode c_str() liefert die String-Daten als const char* - also genau in dem Format, das deine Funktion erwartet)
-
danke erstmal, ich versuch das jetzt auf jeden fall, mal sehen wo ich das überall noch ändern muss...ich werde berichten

aber wiedermals danke für die schnelle, kompetente hilfe!
yes! str1.c_str() etc... geht!
fürs erste passt das schonmal, falls ich heute noch dazu komme werd ich aber alles auf string umschreiben...