Как строки заканчиваются на С#?

Эта программа выбрасывает ArrayIndexOutOfBoundException.

string name = "Naveen";
int c = 0;
while( name[ c ] != '\0' ) {
 c++;
}
Console.WriteLine("Length of string " + name + " is: " + c);

Почему так? Если строки не имеют нулевого окончания. Как строки обрабатываются на С#? Как получить длину без использования свойства string.Length? Я здесь смущен.!

4 ответа

С# не использует завершенные строки NUL, как это делают C и С++. Вы должны использовать свойство Length для строки.

Console.WriteLine("Length of string " + name + " is: " + name.Length.ToString());

или с помощью форматировщиков

Console.WriteLine("Length of string '{0}' is {1}.", name, name.Length);


public static void Main()
 {
 unsafe
 {
 var s = "Naveen";
 fixed (char* cp = s)
 {
 for (int i = 0; cp[i] != '\0'; i++)
 {
 Console.Write(cp[i]);
 }
 }
 }
 }

//печатает Naveen


В C/С++ строка хранится в массиве char AFAIR без разума и поведения. Поэтому, чтобы указать, что такой массив заканчивается где-то, нужно добавить \0 в конец.

С другой стороны, в С# строка - это контейнер (класс со свойствами и методами); как побочная заметка, вы можете присвоить null своему инстанцированному объекту. Вам не нужно ничего добавлять к нему, чтобы указать, где он заканчивается. Контейнер контролирует все для вас. Таким образом, он также имеет итератор (или перечислитель в С#, я думаю). Это означает, что вы можете использовать выражения foreach и LINQ для итерации по нему.

Сказав это, вы можете использовать простой счетчик в коде, подобном этому, чтобы получить длину строки:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LengthOfString
{
 class Program
 {
 static void Main(string[] args)
 {
 string s = "abcde\0\0\0";
 Console.WriteLine(s);
 Console.WriteLine("s.Length = " + s.Length);
 Console.WriteLine();
 // Here I count the number of characters in s
 // using LINQ
 int counter = 0;
 s.ToList()
 .ForEach(ch => {
 Console.Write(string.Format("{0} ", (int)ch));
 counter++;
 });
 Console.WriteLine(); Console.WriteLine("LINQ: Length = " + counter);
 Console.WriteLine(); Console.WriteLine();
 //Or you could just use foreach for this
 counter = 0;
 foreach (int ch in s)
 {
 Console.Write(string.Format("{0} ", (int)ch));
 counter++;
 }
 Console.WriteLine(); Console.WriteLine("foreach: Length = " + counter);
 Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine();
 Console.WriteLine("Press ENTER");
 Console.ReadKey();
 }
 }
}


Вы пытаетесь получить доступ к символу с индексом, который недоступен в соответствии с длиной name. Вы можете решить эту проблему следующим образом:

string name = "Naveen"; 
int c = 0;
while (c < name.Length)
{
 c++;
}

Однако нет необходимости подсчитывать длину строки в С# this путь. Вы можете попробовать просто name.Length

РЕДАКТИРОВАТЬ: на основе того, что @NaveenKumarV предоставляет в комментариях, если вы хотите проверить символы \0, тогда как другие сказали, что вы можете попробовать метод ToCharArray. Вот код:

var result = name.ToCharArray().TakeWhile(i => i != '\0').ToList();

licensed under cc by-sa 3.0 with attribution.