我怎样才能实现“stripslashes”?

时间:2016-12-18 05:11:53

标签: c++ string

我想知道如何在C ++中实现一个函数,它接受一个包含转义控制字符的字符串,并将它们转换为它们(例如Hello\\nWorld\\nHello\nWorld\n)。

有没有办法实现这样一个函数而不需要从每个双字符转义序列映射到以相应的单字符控件字符串开头的每个双字符转义序列?

这是我要传递的测试用例:

#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;
}

1 个答案:

答案 0 :(得分:1)

写一个逃脱者并不难

  std::string stripslashes(std:string const &str)
  {
     std::string answer;
     int i = 0;

    while(i < str.size())
    {
         if(i != '\\')
           answer.pushback(str[i++]);
         else 
         {
             switch(str[i+1])
             {
                case 'n': answer.push_back('\n'); break;
                case 't': answer.push_back('\t'); break;
                ... etc
             }
             i += 2;
         }
     }
   return answer
   }

如果您想优化开关,可以使用查找表,但这几乎不值得。