5

这个程序抛出ArrayIndexOutOfBoundException.

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

为什么会这样?如果字符串不是以空值结尾的。在 C# 中如何处理字符串?如何在不使用string.Length属性的情况下获得长度?我在这里很困惑。!

4

4 回答 4

5

C# 不像 C 和 C++ 那样使用以 NUL 结尾的字符串。您必须使用Length字符串的属性。

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

或使用格式化程序

Console.WriteLine("Length of string '{0}' is {1}.", name, name.Length);  
于 2015-09-25T06:26:11.603 回答
2
 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

于 2015-09-25T06:51:44.450 回答
2

在 C/C++ 中,字符串存储在一个char数组 AFAIR 中,没有智能和行为。因此,要表明这样的数组在某处结束,必须在末尾添加 \0。

另一方面,在 C# 中,字符串是一个容器(具有属性和方法的类);作为旁注,您可以将 null 分配给其实例化对象。您无需向其中添加任何内容来指示它的结束位置。容器为您控制一切。因此,它也有迭代器(或我认为 C# 中的枚举器)。这意味着您可以使用foreachandLINQ表达式对其进行迭代。

话虽如此,您可以在与此类似的代码中使用简单的计数器来获取字符串的长度:

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();
        }
    }
}
于 2015-09-25T07:33:15.643 回答
1

您正在尝试访问根据name长度不可用的索引处的字符。你可以这样解决:

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

但是,没有必要以这种方式在 c# 中计算字符串的长度。您可以简单地尝试name.Length

编辑:根据@NaveenKumarV 在评论中提供的内容,如果您想检查\0字符,那么正如其他人所说,您可以尝试ToCharArray方法。这是代码:

var result = name.ToCharArray().TakeWhile(i => i != '\0').ToList();
于 2015-09-25T06:18:00.230 回答