在c#中不使用内置函数计算字符串长度

时间:2015-01-14 07:27:22

标签: c#

 string str = "test";
 int counter = 0;
 for (int i = 0; str[i] != '\n'; i++)
 {
    counter++;
 }

无法处理错误索引,我不想使用str.length属性,也不想使用foreach循环方法。

请帮忙

提前致谢。

2 个答案:

答案 0 :(得分:3)

字符串不以c#中的任何特殊字符结尾。

我现在只能考虑你的要求(因为你不想使用Framework函数)是访问字符串中的字符,直到它抛出IndexOutOfRangeException例外。

试试这个:(不推荐

string str = "test";
int counter = 0;

try
{
    for (int i = 0; ; i++)
    {
        char temp = str[i];
        counter++;
    }
}
catch(IndexOutOfRangeException ex)
{
}

Console.WriteLine(counter);

答案 1 :(得分:0)

我在String.cs(反汇编)中发现了一些有趣的函数:

private static unsafe int wcslen(char* ptr)
{
    char* end = ptr;
    while (((uint)end & 3) != 0 && *end != 0)
        end++;
    if (*end != 0)
    {
        while ((end[0] & end[1]) != 0 || (end[0] != 0 && end[1] != 0))
        {
            end += 2;
        }
    }
    for (; *end != 0; end++)
        ;

    int count = (int)(end - ptr);

    return count;
}

用法:

class Program
{
    private static void Main(string[] args)
    {
        var a = "asample";

        unsafe
        {
            fixed (char* str_char = a)
            {
                var count = wcslen(str_char);
            }
        }
    }

    private static unsafe int wcslen(char* ptr)
    {
      // impl
    }
}

只是好奇心。不建议在实际代码中使用。最有趣的事情: 以下是wcslen函数内的注释:

// The following code is (somewhat surprisingly!) significantly faster than a naive loop,
// at least on x86 and the current jit.

:)