mit \ in einem string als literal statt einer Flucht
bool stringMatch(const char *expr, const char *str) {
//do something to compare *(expr+i) == '\\'
//In this case it is comparing against a backslash
//i is some integer
}
int main() {
string a = "a\sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
So, das problem jetzt ist: Xcode ist nicht das Lesen in der '\', wenn ich das debugging in stringMatch Funktion expr wird nur angezeigt, 'asb' anstelle der Literale a\sb'.
Xcode ist spuckt eine Warnung in der Zeile:
string a = "a\sb" : Unbekannte escape-Sequenz
Edit: ich habe bereits versucht mit "a\sb", es liest sich als "a\sb" als literal.
en.cppreference.com/w/cpp/language/escape. Ihre andere option ist ein raw-string-Literale, aber es sei denn, Sie schreiben eine regex oder so etwas, es ist ein bisschen overkill.
"a\sb" sollte funktionieren. posten Sie bitte details über das problem, das Sie mit ihm gesehen.
"a\sb" sollte funktionieren. posten Sie bitte details über das problem, das Sie mit ihm gesehen.
InformationsquelleAutor monkeyMoo | 2012-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
C und C++ befassen sich mit umgekehrten Schrägstrichen als escape-Sequenzen standardmäßig. Man muss sagen, dass C nicht zu verwenden, Ihre backslash als escape-Sequenz, indem Sie einen zusätzlichen backslash zu Ihrem string.
Diese sind die üblichen escape-Sequenzen:
EDIT: Xcode verhält sich ungewöhnlich auf Ihrem Rechner. So kann ich schlage vor, Sie diese.
Mach dir keine sorgen über die Räume, in die
string a
Erklärung, Xcode verkettet Zeichenfolgen getrennt durch ein Leerzeichen.EDIT 2: in der Tat Xcode ist das Lesen Ihrer
"a\\b"
wörtlich, das ist, wie es sich mit backslashes escaped. Wenn Sie die Ausgabestring a = "a\\sb"
auf Konsole, du wirst sehen,a\sb
. Aber wenn Sie passierenstring a
zwischen Methoden, die als argument oder als privates Mitglied, dann wird es nehmen Sie den zusätzlichen backslash wahrsten Sinne des Wortes. Sie haben Ihre design-code unter Berücksichtigung dieser Tatsache, so dass es ignoriert die zusätzlichen umgekehrten Schrägstrich. Es ist bis zu Ihnen, wie Sie mit der string.EDIT 3:
Edit 1
ist Ihre optimale Antwort hier, aber hier ist noch einer.Fügen Sie code in Ihre
stringMatch()
Methode zu ersetzen, die doppelten backslashes mit einfachen backslash.Müssen Sie nur fügen Sie diese zusätzliche Zeile am Anfang der Funktion:
Diese lösen sollte der doppelte backslash-problem.
EDIT 4:
Einige Leute denken, Edit 3 ist ObjectiveC und ist somit nicht optimal, so dass eine weitere option in ObjectiveC++.
EDIT 5: Wenn Sie ändern die
const char *
imstringMatch()
zu 'string` es wird weniger Komplex für Sie.P. S. Sie haben alle Antworten, die jetzt, so es ist bis zu Ihnen, die Sie implementieren, die Ihnen die besten Ergebnisse.
Es gibt keine Notwendigkeit, die Verwendung von string-Literale verketten, hier; "ein\x5Csb" funktionieren würde. Auch, re: EDIT2, wo sehen Sie die zusätzlichen umgekehrten Schrägstrich? Ist es in den debugger? Weil ich glaube, dass die Xcode-debugger zeigt die strings escaped. Also die richtige Zeichenfolge mit einem einzelnen backslash erscheinen soll mit zwei in den debugger. Dies wird wahr sein, ob Sie initialisiert den string "a\sb" oder "a\x5csb". Drucken Sie es auf der Konsole zu sehen, die tatsächlichen Inhalte.
Das ist der Punkt, das drucken auf der Konsole entfernt die zusätzlichen umgekehrten Schrägstrich. re: Edit2 -Nein, ich sah es nicht in den debugger, ist es eine Schlussfolgerung, basierend auf meinem test-Fällen. @bames53
Ich denke, etwas muss falsch mit Ihrer Testfälle. Das drucken auf der Konsole nicht strip zusätzlichen backslashes aus einem string. Wenn ein backslash nicht angezeigt wird, in einen string auf der Konsole ausgegeben, dann ist es nicht in der Zeichenfolge.
string a = "a\\sb"; assert(a[0] == 'a'); assert(a[1] == '\\'); assert(a[2] == 's');
Ich kann Ihnen versichern, es ist nichts falsch mit meiner test-Fällen. Der code, den Sie gerade eingegeben haben, beschäftigt sich mit der
string
auf einecharacter
Ebene, so wird auf diese Weise, die Methoden werden nicht sehen, die zusätzlichen umgekehrten Schrägstrich und die Konsole würde offensichtlich zeigena\sb
. @bames53InformationsquelleAutor Derpy Derp
Xcode ist spuckt diese Warnung, weil es die Interpretation
\s
"\sb" als escape-Sequenz, aber\s
ist keine gültige escape-Sequenz. Es wird ersetzt mit nurs
so dass die Kette zu "asb".Flucht vor den backslash wie
"a\\sb"
ist die richtige Lösung. Wenn das irgendwie nicht für Sie arbeiten, bitte senden Sie mehr details auf.Hier ist ein Beispiel.
Den output dieses Programms sieht wie folgt aus:
Wenn man andere Ausgabe bitte posten. Auch bitte genau posten, was problem, das Sie beobachtet, wenn Sie versucht, "a\sb" früher.
Regexs kann ein Schmerz in C++, da backslashes müssen escaped werden auf diese Weise. C++11 hat die raw-strings, die nicht zulassen, dass jede Art der Flucht, so dass die Flucht der backslash nicht notwendig:
R"(a\sb)"
.Überprüfen Sie, ob, und versuchen Sie das Programm zum Beispiel habe ich Hinzugefügt. Post, wenn die Ausgabe unterscheidet sich von der erwarteten Ausgabe.
welche IDE benutzt du?
Visual Studio
oderBloodshed DevC++
oder etwas anderes? @YatingShengXcode
Ich bin mit XCode
InformationsquelleAutor bames53