为什么用户默认情况下不能在其输入中放置转义序列?

时间:2014-12-23 07:46:53

标签: c# string escaping string-literals

所以我正在处理这个挑战,我必须接受用户输入,检查它是否包含转义序列,然后执行转义序列。

我的问题是为什么转义序列在预先确定的字符串变量上执行,然后你接受用户输入并将其存储在变量中。该输入恰好包含转义序列,例如\ n但不执行。

没有用户输入Ex:

string noInput = "this is a escape \n sequence"
Console.WriteLine(noInput);
Console.ReadLine()

Output is : This is an escape 
             sequence

或用户输入Ex:

string input = Console.ReadLine();
Console.WriteLine(input);
Console.ReadLine();

Output is : This is an escape \n sequence 

希望我能够很好地解释我的问题。我假设这可能是因为安全,但想知道答案。

3 个答案:

答案 0 :(得分:3)

转义序列”是语言/编译器的一个特性..在本例中为C#。 相关语言规范可在 - 2.4.4.5 String literals

找到

请注意,该引用是旧版本的语言规范,但仍然适用。 最新版本可以找到here

来自规范 -

在常规字符串 - 文字字符中跟随反斜杠字符()的字符必须是以下字符之一:',“,\,0,a,b,f,n,r,t,u ,U,x,v。否则,发生编译时错误。示例

  • string a =“hello,world”; //你好,世界
  • string b = @“hello,world”; //你好,世界
  • string c =“hello \ t world”; //你好世界
  • string d = @“hello \ t world”; // hello \ t world

重点是,.Net语言可以自由定义字符串文字中的哪些特殊字符将被视为转义序列。但是,它通常是过去C,C ++等语言中使用的语言。

当您接受用户输入时..输入(显然是?)作为文字字符串处理。 (另一种思考方式是,编译后的.Net程序显然与编译器和语言无关。运行时a.k.a CLR在字符串中没有转义序列的概念)

如果你想提供这样的功能(可能你有一个好的场景)..你的选择有限......

  1. 使用即将推出的编译器功能(如Roslyn)为您处理输入字符串。我从未亲自看过Roslyn中哪个特定的API会帮助你做到这一点,但它必须存在,因为Roslyn应该是 编译器本身。
  2. 请注意,这种方法的一个结论是,Roslyn可能非常重要,只能在您的应用中包含一个功能。

    1. 自己编写一个小例程,尝试执行与编译器相同的转义。对于生产质量代码,这可能很棘手(您必须理解并遵循规范以完全匹配它...并且可能使您的实现保持最新,因为它可能会随着C#的未来版本而改变 - 如果新的转义序列是引入)。
    2. 虽然实际上说C#规范中的转义序列不应该随便改变..但我不会赌它。

      1. 找到第三方图书馆,它已经为你做了(包括为了完整答案。)
      2. 编辑:证明您看到的字符串(在源代码中)只是给定语言中源代码的工件 -

        编译一个C#应用程序,其中包含字符串“Hello \ nWorld”。在二进制编辑器中打开已编译的二进制文您在编译的二进制文件中找到的字符串将没有“\ n”,替换为新行字符的相应字节。

答案 1 :(得分:1)

当它在预定的字符串中时,它被视为单个字符。当用户输入' \'然后' n'然后它认为是两个不同的角色。因此,如果用户在一个字符中输入更多字符串。

答案 2 :(得分:0)

尝试使用子字符串或任何字符串操作来实现您想要的并获得/ n部分用户输入。在这里查看: http://msdn.microsoft.com/en-us/library/vstudio/ms228362(v=vs.110).aspx ;)