Подсчитайте длину слова без использования встроенных функций - PullRequest
5 голосов
/ 20 сентября 2011

Это вопрос, с которым я столкнулся и потерпел неудачу

Допустим, скажем

string str = "wordcounter";

Можно легко найти длину, используя str.Length

Однако, так ли это?возможно в C # получить количество букв, без использования встроенных функций, таких как Length, SubStr и т. д.

Ответы [ 9 ]

13 голосов
/ 20 сентября 2011

вы можете написать цикл и увеличить счетчик внутри этого цикла:

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 , которая работает на BSTR . Строки в .NET размещаются в памяти с помощью 4-байтового целого числа, содержащего длину строки, за которым следует столько 2-байтовых символов UTF-16, представляющих каждый символ. Это похоже на то, как BSTR хранятся . Итак:

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 никогда не следует в каком-либо реальном рабочем коде, и код, показанный здесь, не следует воспринимать всерьез.

5 голосов
/ 23 ноября 2012

Мой ответ немного опоздал, но я хотел бы опубликовать то же самое. Хотя все вышеупомянутые решения верны, но я полагаю, что IL foreach действительно знает о длине итерируемого до итерации. Говоря о чистом решении, вот мое:

    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 голосов
/ 20 сентября 2011

не очень быстро, но вы всегда можете зациклить и посчитать количество символов в каратах.

int counter = 0;
foreach (var caracter in str)
{
    counter ++;
}
4 голосов
/ 20 сентября 2011

Как насчет?

int myOwnGetStringLength(String str)
{
    int count = 0;
    foreach(Char c in str)
        count++;
    return count;
}
1 голос
/ 18 декабря 2013
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();

    }
}
0 голосов
/ 08 декабря 2015
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();
    }
}
0 голосов
/ 08 ноября 2015

Мое общее решение заключается в том, чтобы не использовать foreach или StringBuilder (специфичные для C #) или перехватывать какие-либо исключения.

            string str = "wordcounter";
            str += '\0';
            int x = 0;
            while (str[x] != '\0')
                x++;
            Console.WriteLine(x);     //Outputs 11
0 голосов
/ 10 декабря 2014
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;
    }
}
0 голосов
/ 21 апреля 2013
private int getStringLength()
{ 
   string str = "test";
   int counter=0;
   for(int i=0;str[i]!='\n';i++) 
   {
     counter++;
   } 
   return counter;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...