私はエスケープされた制御文字を含む文字列を受け取り、エスケープしない関数をC++で実装する方法を知りたいとします(例えばHello\\nWorld\\n
からHello\nWorld\n
へ)。"stripslashes"はどのように実装できますか?
スラッシュで始まる各2文字のエスケープシーケンスから、対応する1文字の制御文字への大文字と小文字を区別せずに、このような機能を実装する方法はありますか?ここで
は私が渡したいテストケースです:
#include <string>
#include <iostream>
#include <stdio.h>
using std::string;
int main(int argc, char **argv)
{
// before transformation.
string given("Hello\\nWorld\\n");
// after transformation.
string expected("Hello\nWorld\n");
// transformation :: string -> string
auto transformation = [](const string &given) -> string {
// do something to strip slashes from given, and return it.
string result = given;
return result;
};
string result(transformation(given));
// test :: (string, string) -> bool
auto test = [](const string &result, const string &expected) -> bool {
// returns true if the two given strings are equal, false otherwise.
return (result.compare(expected) == 0);
};
puts(given.c_str());
puts(result.c_str());
std::cout << "test result: " << test(result, expected) << "\n";
return 0;
}
あなたが求めていることは明確ではありません。エスケープシーケンスは、C++のソースコード文字列/文字リテラル内でのみ発生します。 – PaulMcKenzie
スラッシュが追加された文字列があるかどうかを確認するために、「\ n」を「\ n」などのエスケープされたコントロールリテラルを有効にするためにどのように「評価する」ことができますか? – Dmitry
ソースコードの文字列リテラルに表示されるものが、実行時に入力として得られるものと混同しています。あなたの説明を見てください( "Hello \ nWorld \ n"から "Hello \ nWorld \ n") - 混乱を見ますか?彼らはどちらも同じです。 "\\ n"に関しては、入力として取得された場合は、ユーザーが1つのスラッシュに続いて 'n'をタイプし、デバッガ(または文字列を表示しているもの)に "\\ n " – PaulMcKenzie