不使用内置函数计算单词长度

时间:2011-09-20 12:18:04

标签: c# string

这是我遇到的一个问题,但失败了

假设说

string str = "wordcounter";

可以使用str.Length

轻松找到长度

但是,在C#中可以获取字母数,而不使用任何内置函数,如LengthSubStr

9 个答案:

答案 0 :(得分:13)

你可以写一个循环并在这个循环中增加一个计数器:

int numberOfLetters = 0;
foreach (var c in str)
{
    numberOfLetters++;
}
// at this stage numberOfLetters will contain the number of letters 
// that the string contains

还有另一种方式:

int numberOfLetters = str.ToCharArray().Length;

使用SysStringByteLen function上的BSTR还有另一种更疯狂的方法。 .NET中的字符串通过使用4字节整数在内存中布局,该整数包含字符串的长度,后跟表示每个字符的许多2字节UTF-16字符。这与BSTRs are stored的方式类似。所以:

class Program
{
    [DllImport("oleaut32.dll")]
    static extern uint SysStringByteLen(IntPtr bstr);

    static void Main()
    {
        string str = "wordcounter";
        var bstr = Marshal.StringToBSTR(str);

        // divide by 2 because the SysStringByteLen function returns 
        // number of bytes and each character takes 2 bytes (UTF-16)
        var numberOfLetters = SysStringByteLen(bstr) / 2; 
        Console.WriteLine(numberOfLetters);
    }
}

显然,做这样的事情而不是使用内置的Length函数永远不应该在任何真正的生产代码中完成,并且不应该认真对待这里显示的代码。

答案 1 :(得分:4)

怎么样?

int myOwnGetStringLength(String str)
{
    int count = 0;
    foreach(Char c in str)
        count++;
    return count;
}

答案 2 :(得分:4)

不是很快但是你总是可以循环并计算所包含的字符数。

int counter = 0;
foreach (var caracter in str)
{
    counter ++;
}

答案 3 :(得分:4)

我的回答有点迟了,但我想发布相同的内容。尽管上面提到的所有解决方案都是正确的,但我相信foreach的IL在迭代之前确实知道了迭代的长度。谈到一个纯粹的解决方案,这是我的:

    private int stringLength(string str) {
        int length = 0;
        bool done = false;
        do {
            try {
                char c = str[length];
                length++;
            } catch (IndexOutOfRangeException) {
                done = true;
            }
        } while(!done);
        return length;
    }

答案 4 :(得分:1)

class Program
{
    static void Main(string[] args)
    {

        string Name = "He is palying in a ground.";
        char[] characters = Name.ToCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = Name.Length - 1; i >= 0; --i)
        {
            sb.Append(characters[i]);
        }
        Console.Write(sb.ToString());
        Console.Read();

    }
}

答案 5 :(得分:0)

class Program
 {
    static void Main(string[] args)
    {
        Console.WriteLine("Enter a string to find its lenght");
        string ch = Console.ReadLine();
        Program p = new Program();
        int answer = p.run(ch);
        Console.WriteLine(answer);
        Console.ReadKey();
    }
    public int run(string ch)
    {
        int count = 0;
        foreach (char c in ch)
        {
            count++;
        }
        return count;
    }
}

答案 6 :(得分:0)

我的一般解决方案涉及不使用' foreach'或者' StringBuilder' (具体是C#)或没有任何例外。

            string str = "wordcounter";
            str += '\0';
            int x = 0;
            while (str[x] != '\0')
                x++;
            Console.WriteLine(x);     //Outputs 11

答案 7 :(得分:0)

class Program
{
    static void Main(string[] args)
    {
        string test = "test";

        //string as char array:
        //iterate through char collection
        foreach (char c in test)
        {
           //do something
        }
        //access elements by index
        Console.WriteLine("Contents of char array : {0}, {1}, {2}, {3}", test[0], test[1], test[2], test[3]);
        Console.ReadKey();
    }
}

答案 8 :(得分:-1)

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