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;
}
C および C++ は、デフォルトでバックスラッシュをエスケープ シーケンスとして扱います。文字列に余分なバックスラッシュを追加して、エスケープ シーケンスとしてバックスラッシュを使用しないように C に指示する必要があります。
これらは、一般的なエスケープ シーケンスです。
- \a - ベル (ビープ音)
- \b - バックスペース
- \f - 用紙送り
- \n - 改行
- \r - キャリッジ リターン
- \t - 水平タブ
- \\ - バックスラッシュ
- \' - 一重引用符
- \" - 二重引用符
- \ooo - 8 進表現
- \xdd - 16 進表現
編集: Xcode がマシン上で異常に動作しています。だから私はあなたにこれを提案することができます。
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" "\x5C" "sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
宣言内のスペースについて心配する必要はありません。Xcode は、スペースでstring a
区切られた文字列を連結します。
編集 2:実際、Xcode は"a\\b"
文字どおりに読み取っています。これが、エスケープされたバックスラッシュを処理する方法です。string a = "a\\sb"
コンソールに出力すると、 a\sb
. ただし、メソッド間を引数として、またはプライベート メンバーとして渡す場合はstring a
、文字どおり余分なバックスラッシュが必要になります。余分なバックスラッシュを無視するように、この事実を考慮してコードを設計する必要があります。糸をどう扱うかはあなた次第です。
編集3: Edit 1
ここでの最適な答えですが、別の答えです。
メソッドにコードを追加してstringMatch()
、二重のバックスラッシュを単一のバックスラッシュに置き換えます。
関数の最初に次の行を追加するだけです。
expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];
これにより、二重バックスラッシュの問題が解決されます。
編集 4:
一部の人々は、編集 3は ObjectiveC であり、したがって最適ではないと考えているため、ObjectiveC++ の別のオプションです。
void searchAndReplace(std::string& value, std::string const& search,std::string const& replace)
{
std::string::size_type next;
for(next = value.find(search); // Try and find the first match
next != std::string::npos; // next is npos if nothing was found
next = value.find(search,next) // search for the next match starting after
// the last match that was found.
)
{
// Inside the loop. So we found a match.
value.replace(next,search.length(),replace); // Do the replacement.
next += replace.length(); // Move to just after the replace
// This is the point were we start
// the next search from.
}
}
編集 5:const char *
inを 'string` に変更するstringMatch()
と、複雑さが軽減されます。
expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str );
編集 6: C++11 以降、次のようなものが存在しますraw string literals
。これは、エスケープする必要がないことを意味します。代わりに、次のように記述できます。
string a = R"raw(a\sb)raw";
raw
文字列内の は、選択した任意の区切り文字に置き換えることができることに注意してください。)raw
これは、実際の文字列のように部分文字列を使用したい場合です。std::regex
. _
PS これですべての答えが得られたので、どれを実装して最良の結果が得られるかはあなた次第です。