使变量字符串忽略转义序列
Make variable string ignore escape sequences
我目前遇到将字符串解析为另一种方法的问题。问题是我想阻止它使用可能的转义序列。
我要解析的字符串不是常量,因此(据我所知)使用 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 ("
前后多了一个字符
当您在源代码中编写 字符串文字 时, 编译器 会将转义序列替换为它们所代表的字符。这就是为什么示例中的 quoted string 变成了废话。修复 that 的方法是用两个反斜杠替换每个反斜杠,或者使它成为原始字符串文字。
当您的程序读取文本输入时,它不会进行任何这些调整。所以如果代码确实
std::string input;
std::cin >> input;
并且用户在控制台中键入字符 \x10\x5\x1a\aTestInput\n \x6(
,input
将以字符 \x10\x5\x1a\aTestInput\n \x6(
.
结尾
获得字符串后,无论是作为字符串文字还是来自控制台的文本,您都可以使用它做任何想做的事情。
在 C/C++ 字符串(和 Java、JavaScript、PHP...)中,您有两种可能让反斜杠保持反斜杠
- 将所有反斜杠加倍
正如您所说,您想将所有反斜杠加倍。这可以。如果输入是:
\\
那么您的 C/C++ 字符串将是:
"\\\\"
(一口,我知道...)
- 使用Hex/Octal字符
另一种方法,如果您不太喜欢双反斜杠(如果它以某种方式吓到您),则使用八进制或十六进制(或较新版本中的 Unicode)的字符序列:
\ becomes "4" or "\x5C"
您可能已经注意到,这意味着每个反斜杠有 4 个字符。所以大多数人通常只会加倍反斜杠(一个 2 个字符)。再加上双反斜杠很好理解。您后面的程序员可能不太了解代码点。
附带说明一下,如果您的用户可以输入任何字符,那么他们也可以输入双引号 (") 字符。重要的是您还要转义这些字符。您可以类似地使用反斜杠和双引号字符或其代码点:
\" or 2 or \x22
我目前遇到将字符串解析为另一种方法的问题。问题是我想阻止它使用可能的转义序列。
我要解析的字符串不是常量,因此(据我所知)使用 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 ("
前后多了一个字符当您在源代码中编写 字符串文字 时, 编译器 会将转义序列替换为它们所代表的字符。这就是为什么示例中的 quoted string 变成了废话。修复 that 的方法是用两个反斜杠替换每个反斜杠,或者使它成为原始字符串文字。
当您的程序读取文本输入时,它不会进行任何这些调整。所以如果代码确实
std::string input;
std::cin >> input;
并且用户在控制台中键入字符 \x10\x5\x1a\aTestInput\n \x6(
,input
将以字符 \x10\x5\x1a\aTestInput\n \x6(
.
获得字符串后,无论是作为字符串文字还是来自控制台的文本,您都可以使用它做任何想做的事情。
在 C/C++ 字符串(和 Java、JavaScript、PHP...)中,您有两种可能让反斜杠保持反斜杠
- 将所有反斜杠加倍
正如您所说,您想将所有反斜杠加倍。这可以。如果输入是:
\\
那么您的 C/C++ 字符串将是:
"\\\\"
(一口,我知道...)
- 使用Hex/Octal字符
另一种方法,如果您不太喜欢双反斜杠(如果它以某种方式吓到您),则使用八进制或十六进制(或较新版本中的 Unicode)的字符序列:
\ becomes "4" or "\x5C"
您可能已经注意到,这意味着每个反斜杠有 4 个字符。所以大多数人通常只会加倍反斜杠(一个 2 个字符)。再加上双反斜杠很好理解。您后面的程序员可能不太了解代码点。
附带说明一下,如果您的用户可以输入任何字符,那么他们也可以输入双引号 (") 字符。重要的是您还要转义这些字符。您可以类似地使用反斜杠和双引号字符或其代码点:
\" or 2 or \x22