strings
-
Noch eine Frage bezüglich strings.
Ist es irgendwie möglich, wenn man aus einem string ein char ausliest, ab der Adresse dieses Zeichens den rest des strings als c string zu bekommen?
Quasi so:string s = "blablablabla"; char c = s[4]; char* s2 = &c;
theoretisch müsste s2 jetzt den wert "lablabla" haben. Leider ist es aber nicht so.
Oder ist es überhaupt nicht möglich?
-
Müsst eigentlich funktionieren:
string foo = "foo"; char *bar = foo.substr(1, 2).c_str();
-
das ist schon klar.
Das Problem liegt an dieser Stelle (fett markiert):[cpp]std::string::iterator it = m_rStr.begin();
std::string::iterator itTokenEnd = m_rStr.begin();
std::string::iterator itEnd = m_rStr.end();
//Eat seperators
while(it != m_rStr.end()) {
if(rDelim(*it)) it++;
//Find next token
itTokenEnd = find_if(it, itEnd, rDelim);
//Append token to result
if(it < itTokenEnd) push_back(std::string(it, itTokenEnd));
it = itTokenEnd;
}
[/cpp]
Das ist ein Ausschnitt aus einer template classe und rDelim ist der Template parameter. Kann also von jedem Typ sein. Unter anderem auch von Type der unteren Listings. Hauptache diese implementieren die unary_function.aber an dieser Stelle muss ich je nach dem was gewünscht ist entweder mit chars oder mit strings arbeiten
[cpp]
class CIsString : public std::unary_function<char, bool> {
public:
//Constructor specifying the separators
CIsString::CIsString(const std::string& rostr) : m_ostr(rostr) {}
bool operator()(char c) const {
[...]
}private:
std::string m_ostr;
};
[/cpp]
in diesem Falls mit stringsclass CIsSpace : public std::unary_function<char, bool> { public: bool operator()(char c) const { // isspace returns true if c is a white-space character // (0x09-0x0D or 0x20) return (isspace(c) == 0 ? false : true); } };
in diesem Fall aber mit chars.
Wenn ich das Ganze auf string umschreibe und je nach aufgabe nur den ersten character aus der Zeichenfolge raushole oder nicht, meckert mir der Compiler wegen der unary_function, denn das ding will nur primitive datentüpen (nicht mal pointer auf diese) haben.
-
string s = "blablablabla"; char c = s[4]; char* s2 = &c;
Der Stolperstein hier ist, dass du in der zweiten Zeile das char kopierst. Dementsprechend hat c natürlich eine ganz andere Adresse, und diese andere weist du hier s2 zu.
string s = "blablablabla"; const char* s2 = s.c_str()+4;
sollte deinen Job tun. Wohlgemerkt hast du so nur Lesezugriff, aber alles andere wäre, glaube ich, nicht portabel.
-
Danke dir!!! Der Hinweis mit dem Kopieren war sehr hilfreich.
Jetzt funzt!!