使变量字符串忽略转义序列

时间:2019-09-17 13:32:08

标签: c++ string escaping

我当前遇到一个将字符串解析为另一种方法的问题。问题是我想防止它使用可能的转义序列。

我想解析的字符串不是恒定的,所以(据我所知)使用R声明使其成为原始文字不适用,因为我必须使用变量。

此外,在某些情况下,用户输入包含在字符串中(未转换),因此通过用“ \\”替换“ \”字符来转义这些序列也不是一种选择,输入也可以包括那些序列

要在此问题上更准确地进行说明: 格式如f.e. “” \ x10 \ x4 \ x6(“”一旦被解析为下一个函数,就会被自动编译并转换为非人类可读的格式。我想防止这种转换,而无需为了获得完全相同的字符串在下一个需要使用的功能中。

希望由于我不熟悉c ++编程,所以有人可以帮助我。在此先感谢:D

#include "pch.h"
#include <iostream>

int main()
{
    stringTester stringtester;
    std::string test = stringtester.exampleString();
    stringtester.stringOutput(test);
}

std::string stringTester::exampleString()
{
    std::string exampleInput = "\x10\x5\x1a\aTestInput\\n \x6(";
    return exampleInput;
}

void stringTester::stringOutput(std::string test)
{
    std::cout << test << std::endl;
}

她(从控制台复制)的实际输出是“ TestInput \ n(”,而所需的输出将是原始字符串“ \ x10 \ x5 \ x1a \ aTestInput \ n \ x6(”

编辑:在SO上似乎无法显示未知字符。 “ TestInput \ n(“

的前面和后面都有xtra字符

2 个答案:

答案 0 :(得分:1)

当您在源代码中编写字符串文字时,编译器会将转义序列替换为它们所代表的字符。这就是为什么示例中的带引号的字符串变成废话的原因。解决此问题的方法是用两个反斜杠替换每个反斜杠,或者使其成为原始字符串文字。

程序读取文本输入时,不会进行任何这些调整。所以如果代码有

std::string input;
std::cin >> input;

并且用户在控制台中输入字符\x10\x5\x1a\aTestInput\\n \x6(input将以字符\x10\x5\x1a\aTestInput\\n \x6(结尾。

一旦获得了字符串(无论是字符串文字还是控制台中的文本),您都可以使用它进行任何操作。

答案 1 :(得分:0)

在C / C ++字符串(以及Java,JavaScript,PHP ...)中,反斜杠保留为反斜杠有两种可能性

  1. 将所有反斜杠加倍

正如您所说,您想将所有反斜杠加倍。这可以。如果输入是:

\\\\

然后您的C / C ++字符串将为:

"\\\\\\\\"

(一口,我知道...)

  1. 使用十六进制/八进制字符

如果您不太喜欢双反斜杠(以某种方式吓到您),另一种方法是使用八进制或十六进制(或新版本中的Unicode)的字符序列:

\    becomes   "\134"   or   "\x5C"

不过,您可能会注意到,这意味着每个反斜杠4个字符。因此,大多数人通常会将反斜杠加倍(一个2个字符)。再加上双反斜杠是众所周知的。代码点可能不像后面的程序员所熟知。

请注意,如果您的用户可以输入任何字符,那么他们也可以输入双引号(“)字符。重要的是您也应将其转义。您可以类似地使用反斜杠和双引号字符或其代码点:

\"   or   \042   or   \x22