Invalid conversion und forbids comparison
-
Hallo Leute,
ich hab hier grad ein Problem: Ich habe hier eine Split-Funktion, die jedoch leider nicht ganz will und ich komm noch nicht dahinter, wie ich das ändern kann.
std::vector<std::string> splittolines(std::string text) { std::vector<std::string> erg; const char* newline = "\n"; for (size_t i = 0; i < text.length(); i++) { std::string s; if (text.at(i) == newline) { erg.push_back(s); } else { s.append(text.at(i)); } } return erg; }Fehlermeldung:
Functions.cpp: In function ‘std::vector<std::basic_string<char> > splittolines(std::string)’:
Functions.cpp:71:23: error: ISO C++ forbids comparison between pointer and integer
Functions.cpp:77:26: error: invalid conversion from ‘char’ to ‘const char*’So, ich hab gelesen, dass ich dieses at() nicht mit einem chat vergleichen kann. Was kann ich aber machen, damit ich so einen Vergleich machen kann?
-
Du hast hier eben keinen char, sondern einen char-Zeiger, auch C-String genannt. Die Lösung ist einfach:
const char newline = '\n';
-
char newline = '\n';
-
Jetzt bekomme ich folgende Fehlermeldung:
Functions.cpp: In function ‘std::vector<std::basic_string<char> > splittolines(std::string)’:
Functions.cpp:77:26: error: invalid conversion from ‘char’ to ‘const char*’
-
- hier stand was falsches -
Zeig den gesamten Code der den Fehler verursacht - wer weiss was Du geändert hast...
-
Ich weiß zwar nicht, ob diese Lösung flotter ist als deine, aber einfacher ist sie auf alle Fälle:
std::vector<std::string> split(std::string text, char delim) { std::stringstream ss(std::move(text)); std::vector<std::string> result; while(std::getline(ss, text, delim)) result.push_back(std::move(text)); return result; }
-
Ich brauch die Lösung für dieses Problem noch in einer anderen Funktion. Deshlab wäre es gut, wenn ich die Lösung irgendwie so hinbekomme.
Im schlimmsten Fall müsste ich zuviel neu schreiben.std::vector<std::string> splittolines(std::string text) { std::vector<std::string> erg; char newline = '\n'; for (size_t i = 0; i < text.length(); i++) { std::string s; if (text.at(i) == newline) { erg.push_back(s); } else { s.append(text.at(i)); } } return erg; }
-
Mach doch ein
s += text[i];daraus.
-
bluepeople12 schrieb:
Ich brauch die Lösung für dieses Problem noch in einer anderen Funktion. Deshlab wäre es gut, wenn ich die Lösung irgendwie so hinbekomme.
Im schlimmsten Fall müsste ich zuviel neu schreiben.What?
-
314159265358979 schrieb:
Mach doch ein
s += text[i];daraus.
Ändert doch nichts an der Tatsache, dass ich hier
if (text.at(i) == newline)ein Problem hab ...

-
append möchte andere Argumente, als du ihm gibst:
http://www.cplusplus.com/reference/string/string/append/Und nimm 314159265358979s Vorschlag, der ist in jeder Hinsicht besser. Dein Argument verstehe ich überhaupt nicht (sowohl sprachlich als auch das was ich mir inhaltlich zusammen reime, was du wohl meinst):
Ich brauch die Lösung für dieses Problem noch in einer anderen Funktion. Deshlab wäre es gut, wenn ich die Lösung irgendwie so hinbekomme.
Im schlimmsten Fall müsste ich zuviel neu schreiben.
-
Du machst was anderes falsch, der Vergleich ist richtig. Statt .at() solltest du trotzdem [] verwenden, da i sowieso keine Werte größer der Länge des Strings - 1 annehmen kann.
-
Ach Jungs, tut mir leid. War mein Fehler. Ihr habt Recht, ich hätte es so schreiben müssen:
s += text[i];
-
Hm...
Was haltet ihr davon?
template <typename C, typename T, typename A> std::vector<std::basic_string<C, T, A>> split(std::basic_string<C, T, A> text, C delim) { std::basic_stringstream<C, T, A> ss(std::move(text)); std::vector<std::basic_string<C, T, A>> result; while(std::getline(ss, text, delim)) result.push_back(std::move(text)); return result; }
-
Welchen Header hat std::stringstream ?
-
<sstream>
-
Warum kommt dann jetzt immer das hier ?
Functions.cpp: In function ‘std::vector<std::basic_string<char> > split(std::string, char)’:
Functions.cpp:67:26: error: ‘move’ is not a member of ‘std’
Functions.cpp:71:26: error: ‘move’ is not a member of ‘std’
make: *** [Functions.o] Error 1
-
#include <utility>
C++0x musst du auch aktivieren, ansonsten die moves weglassen. (Dadurch wird der Code aber ineffizienter.)
-
Wenn ich die moves weglassen möchte und nicht auf dieses C++0X aufsteigen, reicht es wenn ich std::move wegmache oder muss ich noch was anderes machen ?
-
Du willst aber auf den C++0x Zug aufspringen, denn das ist die Zukunft.
Nein, musst du nicht, aber du solltest den Parameter zuconst std::string&ändern.
Edit: Unter Visual Studio ist C++0x übrigens von Haus aus aktiviert, wenn du die 10er Version hast.
-
Die aktuelle Funktion schaut so aus, bringt aber noch nciht ganz das erwünschte ...

std::vector<std::string> split(const std::string& text, char delim) { std::stringstream ss(text); std::vector<std::string> result; while(std::getline(ss, text, delim)) result.push_back(text); return result; }Functions.cpp: In function ‘std::vector<std::basic_string<char> > split(const std::string&, char)’:
Functions.cpp:69:39: error: no matching function for call to ‘getline(std::stringstream&, const std::string&, char&)’
make: *** [Functions.o] Error 1