代码之家  ›  专栏  ›  技术社区  ›  Finglas

比较C中包含格式的字符串#

  •  2
  • Finglas  · 技术社区  · 14 年前

    我正在研究一个给定一些设置的函数——比如行距,输出(字符串形式)被修改。为了测试这样的场景,我使用了字符串文本,如下所示,以获得预期的结果。

    方法,使用字符串生成器,( AppendLine )产生所述输出。我遇到的一个问题是比较这样的字符串。在下面的示例中,两者在所代表的内容方面是相等的。结果就是我关心的领域,但是当比较两个字符串时,一个是文字,一个不是,相等自然会失败。这是因为其中一个字符串发出行距,而另一个字符串只演示它所包含的格式。

    解决这个平等问题的最好方法是什么?我确实关心方法结果中的格式设置,比如新行,这非常重要。

    代码:

    string expected = @"Test\n\n\nEnd Test.";
    string result = "Test\n\n\nEnd Test";
    
    Console.WriteLine(expected);
    Console.WriteLine(result);
    

    输出:

      Test\n\n\nEnd Test.
      Test
    
    
      End Test
    
    4 回复  |  直到 14 年前
        1
  •  4
  •   Will Marcouiller    14 年前

    这个 @ 前缀告诉编译器按照所写的方式获取字符串。所以,它不格式化 \n 回车和换行的字符。

    因为分配给您的字符串没有相同的前缀 结果 变量,编译器格式化它。如果您想继续使用 @ 前缀,只需执行以下操作:

        string expected = @"Test
    
    
    End Test";
    

    您必须在字符串中输入回车和换行符作为不可见字符。

        2
  •  3
  •   Adam Robinson    14 年前

    你用“字面”这个词不正确。“literal”只是指代码中存在的实际值。换言之,代码中的值要么是 变量 (为了简单起见,我在这个组中包含常量)和 字面量 . 变量是抽象的 概念 值,而文本 是一个值 .

    所有这些都是说,您的两个字符串都是字符串文本,因为它们是硬编码到您的应用程序中的。这个 @ 前缀只是声明编译器将在字符串中包含转义字符(实际上,除了双引号之外的任何字符),而不是在将字符串文字编译到程序集中时评估转义序列。

    首先, 无论函数返回什么(包含换行标准转义序列而不是换行本身的字符串,或者实际包含换行的字符串),都是测试变量应该包含的内容。 . 使您的测试尽可能接近实际的输出,因为将值按摩成可比较的形式所做的工作越多,您必须测试的代码路径就越多。如果您希望能够将字符串与嵌入其中的格式转义序列进行比较,并将这些序列评估为字符串(基本上是比较示例中的两个字符串),那么我会这样说:

    1. 确保这是你真正想要的。
    2. 在解释这些值和将“格式字符串”转换为 格式化的 “字符串”。

    对于2,regex处理器可能是最简单的选择。见 this page 对于C字符串转义序列的列表。

        3
  •  0
  •   Finglas    14 年前

    我感到有些开明,但对我发现的东西感到恼火。

    这是我第一个使用MSTEST的项目,测试失败后,我选择 查看测试详细信息 看看我的测试是怎么失败的,为什么失败的。此详细信息显示中字符串输出的格式非常差,例如,您得到:

    Assert.AreEqual failed. Expected:<TestTest End>. Actual:<TestTest End>.
    

    这是格式化文本-奇怪的是如果你 /r (换行)而不是换行符( /n )格式实际上有些正确。

    结果是查看运行测试所需的正确输出 调试 模式。换句话说,当您有一个失败的测试时,在调试中运行测试,异常将被捕获并显示如下:

    Assert.AreEqual failed. Expected:<Test
    
    
    Test End>. Actual:<Test
    
    
     Test End>.
    

    上面显然包含了正确的格式。

    最后,我最初用字符串存储期望值(带格式)的方法是正确的,但是我对MSTEST的不熟悉使我怀疑了我的方法,因为它似乎是有效输入,但仅仅是在一个有效输出中显示给我自己。

        4
  •  -1
  •   Ian Jacobs    14 年前

    在进行比较之前使用regex去除空白?