【问题标题】:Can i determine string length in c# doing something like this? [closed]我可以在 c# 中确定字符串长度吗? [关闭]
【发布时间】:2017-09-08 19:15:28
【问题描述】:

出于好奇,我试图在不使用属性或方法的情况下确定字符串长度,这在 C 中有效,但对于 \0 的概念来说仍然是一种新事物。

据我了解,我说的是C,这个字符是在为某个字符串设置值后自动放置的东西,这样就可以确定需要多少空间来存储,但是这在 C# 中是如何工作的?

string str = "someText";
int lenght = 0;
while (str[lenght]!='\0')
{
    lenght++;
}
Console.WriteLine(str);
Console.WriteLine("String lenght is : "+ lenght);
Console.ReadLine();

【问题讨论】:

  • C# 字符串不是以 null 结尾的。
  • 在询问它是如何工作的之前,您是否尝试过调试和跟踪它?发生的事情应该很明显......
  • 字符串有两个字段:int m_stringLengthchar _firstChar,它们不是以空结尾的,因为长度是已知的。 编辑: 实际上,它们是空终止的,这是来自 coreclr 存储库的注释:" // 对于空字符串,这将是 '\0',因为 // 字符串既是空终止的又是长度前缀”
  • @LeonardoAlvesMachado 确实如此; String 类上提供长度的方法是 Length 属性。
  • 在 c# 中,字符串的最后一个字符不是 C 中的空值字符。您可能需要捕获 IndexOutOfRangeException 来确定字符串的结尾。

标签: c# string-length


【解决方案1】:

将字符串视为抽象的字符序列。有多种方法可以在计算机库中实现这种序列。以下是一些示例:

  • 空终止 - 字符序列以特殊字符值'\0' 终止。 C 使用这种表示。
  • 字符终止 - 这类似于空终止,但使用了不同的特殊字符。现在这种情况很少见。
  • 长度前缀 - 字符串的前几个字节用于存储其长度。 Pascal 使用了这种表示。
  • 长度和字符数组 - 这种表示将字符串存储为具有字符数组的结构,并将长度存储在单独的区域中。

混合表示也是可能的,例如在长度和数组表示中存储以空值结尾的字符串。

C# 使用以长度为前缀和以空结尾的字符串的组合,并且还允许在字符串中嵌入空字符。但是,这并不意味着您可以访问空终止符或长度字节,因为与 C 不同,C# 执行绑定检查,并在尝试访问超出字符串末尾时抛出异常。

【讨论】:

  • "C# 使用以长度为前缀和以空字符结尾的字符串的组合" 有此语句的来源吗? String 的文档另有说明。
  • @Amy 这来自阅读参考源herehere。评论和断言说他们期望空终止存在。这很可能是为了与 C 库兼容和调试。
  • 不错的发现。 "对于空字符串,这将是 '\0',因为字符串都是以 null 结尾并以长度为前缀的"
  • @Amy 文档没有提到字符串是空终止的,因为它是一个实现细节,而不是语言的一部分(您自己的运行时可能选择不以这种方式表示字符串),而且因为它是空终止的事实对你来说是模糊的。
  • @Servy 但是如果它是一个实现细节,那么说 C# 同时使用空终止字符串和长度前缀字符串是不正确的吗?问题是关于语言,而不是特定的实现。
【解决方案2】:

字符串是String 类型的对象,其值为文本。在内部,文本存储为 Char 对象的顺序只读集合。 C# 字符串的末尾没有空终止字符;因此,C# 字符串可以包含任意数量的嵌入空字符 ('\0')。 字符串的 Length 属性表示它包含的 Char 对象的数量,而不是 Unicode 字符的数量。要访问字符串中的各个 Unicode 代码点,请使用 StringInfo 对象。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/

C# 字符串没有终止字符。相反,它们的实际长度与文本本身一起存储。这称为length-prefixed strings

您可以使用Length 属性访问长度。

【讨论】:

    【解决方案3】:

    在 C 中,nul 字符终止作为字符数组处理的字符串是标准库支持的约定。它不是语言本身的一部分。请注意,在设置 C 字符串值时,没有什么可以“自动”放置 nul 字符,它由库和编译器中的常量处理。

    C# 不使用以 nul 结尾的字符串,因此这些都不适用。

    【讨论】:

      【解决方案4】:

      这里是 C# 代码

          string str = "someText";
          int lenght = 0;
      
          foreach (char c in str)
          {
              lenght++;
          }
          Console.WriteLine(str);
          Console.WriteLine("String lenght is : "+lenght);
          Console.ReadLine();
      

      【讨论】:

      • 但这并不能回答问题。
      • 你错过了问题的重点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多