为什么给定代码中的相同字符串的substr函数的行为不同

时间:2019-06-27 16:00:59

标签: c++ string substr

i有两个字符串s和s2,其中s被初始化为s2作为用户输入。 两个字符串都具有如下相同的字符: “ \ t \ n \ t \ n asd \ tnhy \ nhgf \ twerdsff \ tdfd \ nsgsgb hg” 但是s.substr(0,2)显示为空白,而s2.substr(0,2)显示\ t

string s = "\t \n \t \n asd  \tnhy \nhgf \twerdsff      \tdfd\nsgsgb   hg";
cout<<s.substr(0,2)<<endl;
if(s.substr(0,2)=="\t")
    cout<<"screwed one \n";
string s2;
getline(cin,s2);
cout<<s2.substr(0,2)<<endl;
if(s2.substr(0,2)=="\t")
    cout<<"screwed two \n";

我期望相同的行为。 并且没有打印出“拧一个”或“拧两个”。 在屏幕上看到\ t后,我也希望显示“拧紧两个”

2 个答案:

答案 0 :(得分:1)

在C ++中,escape sequences用单个反斜杠(\)标记。 \t默认情况下解释为单个列表。

如果要准确插入序列\t(而不是列表),可以通过两种方法(很好,但最常见的是两种):

  1. 使用raw string literal(来自C ++ 11):
    std::string s = R"eos(\t \n \t \n asd  \tnhy \nhgf \twerdsff      \tdfd\nsgsgb   hg)eos";  

这里eos用作分隔符,但可以是任何东西。重要的是它也必须出现在末尾(使用))。原始字符串是“所见即所得”功能。分隔符之间的所有内容都将与您输入的一样在最终字符串中。

  1. 转义序列的转义:
    std::string s = "\\t \\n \\t \\n asd  \\tnhy \\nhgf \\twerdsff      \\tdfd\\nsgsgb   hg";

可以将反斜杠转义,从而在字符串中产生一个反斜杠。


但是,如果您希望从用户输入中获取空格,则没有内置方法可以做到。您必须解析该字符串,寻找任何\并将其与下一个具有相关字符的字母一起替换。

in this question

上有很多很好的答案

答案 1 :(得分:0)

好吧,这是关于输入中使用的字符。例如'\t'是一个代表制表符的char,在任何情况下,它都与两个'\''t'分开的字符的顺序不同。