Problem mit Variablen
-
Hi @all
Ich hab bei der folgenden Func das Problem das der Rest von "Buffer" nicht an "Preis" übergeben wird der Compiler zeigt keinen Fehler an.thx im vorraus
P.S. Ich Programmiere erste seit c.a einen Halben jahr also nicht über schlechten still wunder ^^
bool such(ifstream& stream,char str1[256] ) { int posstern, next; char buffer[512]; char stern[2] = "#"; char dings[2] ; while(stream.getline(buffer,sizeof(buffer)) ) { char tmp1[256],tmp2[256]; strncpy(tmp1,str1,sizeof(tmp1)-1); strncpy(tmp2,buffer,sizeof(tmp2)-1); for(int i = 0;i < sizeof(str1);i++) { if(isupper(str1[i])) str1[i]=tolower(str1[i]) ; } for(int i = 0;i < sizeof(buffer);i++) { if(isupper(buffer[i])) buffer[i]=tolower(buffer[i]) ; } if(strncmp(str1,buffer,4) == 0) { for(int i = 0 ;i < sizeof(buffer);i++) { dings[1] = buffer[i] ; if(strncmp(dings,stern,1)==0) { posstern = i ; cout<<"i = "<<i<<endl; } } for(int i = 0; i < posstern;i++) { carname[i]= buffer[i]; } for(int i = posstern; i < sizeof(buffer);i++) { preis[i]= buffer[i]; //Wird nicht übergeben } //strncpy(str1,tmp1,sizeof(str1)-1); //strncpy(str2,tmp2,sizeof(str2)-1); return true; } else { return false ; } } }
-
vielleicht variablen posstern und next mit =0 initialisieren
und bei den strcopy-Zeilen ist das -1 wohl überflüssig?
wieso ist stern überhaupt 2 Zeichen lang? char stern='*' oder so reicht. genau wie bei dings.
-
Vermutlich sind stern und dings als char-arrays initialisiert, damit sie beim zeichenkettenvergleich verwendet werden können.
Ich halte (persönlich) allein den Zweck dieser Funktion für absolut fragwürdig (von der Bezeichnung mal abgesehen). Offensichtlich soll hier versucht werden zu überprüfen, ob eine Zeichenkette (char*) in einem Eingabestrom (hier std::ifstream) vorhanden ist. Den Rest habe ich mir nicht mehr angeschaut, weil ich ad hoc nicht durchblicken konnte/wollte.
Um eine Zeichenkette in einer anderen Zeichenkette zu suchen, verwendet man in C++ die Methode std::string::find. Diese gibt die Position der gefundenen Zeichenkette zurück. Konnte die Zeichenkette nicht gefunden werden, so wird die Konstante std::string::npos zurückgeben.
Hinweis: Die Header-Datei string muss eingebunden werden.
std::string quellstring("Hier wird was gesucht"); std::string suchstring("was"); int pos = quellstring.find(suchstring);EDIT: Der Zeichenkettenvergleich von std::string erfolgt intuitiv, da der Vergleichsoperator entsprechend überladen wurden:
std::string a("Alpha"); std::string b("Bravo"); std::string c("Bravo"); a == b; // => false b == c; // => true a != c; // => true@OP:
Du kommst aus C ?
Was ist überhaupt der Zweck deiner Funktion?Grüße...
Heiko
-
also sin der func is es einen Eingegeben text mit einer Zeile aus einer Datei zu vergleichen wenn diese Gleich sind soll die Zeile bei '#' getrennt werden und der teil vor '#' an die variable autoname und der rest nach '#' soll an preis übergeben werden
-
bool search(std::ifstream& stream, const std::string& find, std::pair<std::string, double>& dest) { std::string tmp; while (std::getline(stream, tmp)) { std::size_t pos = tmp.find(find); if (pos == std::string::npos) continue; pos = tmp.find_last_of('#'); if (pos == std::string::npos) throw std::runtime_error("price not found"); std::istringstream ss(tmp.substr(pos + 1)); double price = 0.0; ss >> price; if (!ss) throw std::runtime_error("invalid datatype for price"); dest = std::make_pair(tmp.substr(0, pos), price); return true; } return false; }Bliblablu ... so macht die Funktion was du haben wolltest
Erst Zeile einlesen ... dann gucken ob das drin steht was du suchst ... wenn ja, dann nach # suchen. Das was hinter # steht soll der Preis sein => in double umwandeln. Wenn # nicht gefunden wird oder die Umwandlung fehlschlägt tritt ein Ausnahmezustand ein ... dann noch das was wir rausgefunden haben an dest übergeben und fertig.#include <sstream> #include <fstream> #include <string> #include <utility> #include <stdexcept>... sollten alle Sachen drin sein, die die Funktion braucht.
-
cool thx