我当前遇到一个将字符串解析为另一种方法的问题。问题是我想防止它使用可能的转义序列。
我想解析的字符串不是恒定的,所以(据我所知)使用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字符答案 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 ...)中,反斜杠保留为反斜杠有两种可能性
正如您所说,您想将所有反斜杠加倍。这可以。如果输入是:
\\\\
然后您的C / C ++字符串将为:
"\\\\\\\\"
(一口,我知道...)
如果您不太喜欢双反斜杠(以某种方式吓到您),另一种方法是使用八进制或十六进制(或新版本中的Unicode)的字符序列:
\ becomes "\134" or "\x5C"
不过,您可能会注意到,这意味着每个反斜杠4个字符。因此,大多数人通常会将反斜杠加倍(一个2个字符)。再加上双反斜杠是众所周知的。代码点可能不像后面的程序员所熟知。
请注意,如果您的用户可以输入任何字符,那么他们也可以输入双引号(“)字符。重要的是您也应将其转义。您可以类似地使用反斜杠和双引号字符或其代码点:
\" or \042 or \x22