5.2 字符串类String的使用

前面的章节中介绍了Char类型,它只能表示单个字符,不能表示由多个字符连接而成的字符串。在C#语言中字符串作为对象来处理,可以通过String类来创建字符串对象。

5.2.1 字符串的声明及赋值

视频讲解:光盘\TM\lx\5\02字符串的声明及赋值.mp4

在C#语言中,字符串必须包含在一对" "(双引号)之内。例如:

        "23.23"、"ABCDE"、"你好"

这些都是字符串常量,字符串常量是系统能够显示的任何文字信息,甚至是单个字符。

注意 在C#中由" "号包围的都是字符串,不能作为其他数据类型来使用,如"1+2"的输出结果永远也不会是3。

可以通过以下语法格式来声明字符串变量:

        String str = [null]

String:指定该变量为字符串类型。

str:任意有效的标识符,表示字符串变量的名称。

null:如果省略null,表示str变量是未初始化的状态,否则表示声明的字符串的值就等于null。

【例5.5】声明字符串变量s,实例代码如下。

        String s;

说明 声明字符串变量必须经过初始化才能使用,否则编译器会报出“使用了未赋值的变量”

声明字符串之后,需要对其进行赋值,字符串的赋值使用“=”,例如,声明一个字符串变量str,并为其赋值“C#编程词典”,代码如下:

        string str = "C#编程词典";

5.2.2 连接多个字符串

视频讲解:光盘\TM\lx\5\03连接多个字符串.mp4

使用“+”运算符可完成对多个字符串连接的功能。“+”运算符可以连接多个字符串并产生一个String对象。

【例5.6】定义两个字符串,使用“+”运算符连接,代码如下。

        String s1="hello";      //声明String对象s1
        String s2="world";      //声明String对象s2
        String s=s1+" "+s2;   //将对象s1和s2连接后的结果赋值给s

技巧 C#中一句相连的字符串不能分开在两行中写。例如:

              Console.WriteLine("I like
              C#")

这种写法是错误的,如果一个字符串太长,为了便于阅读,可以将这个字符串分在两行上书写。此时就可以使用“+”将两个字符串连起来,之后在加号处换行。因此,上面的语句可以修改为:

              Console.WriteLine ("I like"+
              "C#");

5.2.3 比较字符串

视频讲解:光盘\TM\lx\5\04比较字符串.mp4

对字符串值进行比较时,可以使用前面学过的比较运算符“==”实现。

【例5.7】使用比较运算符比较两个字符串的值是否相等,实例代码如下。

        string str1 = "mingrikeji";
        string str2 = "mingrikeji";
        Console.WriteLine((str1 == str2));

此时,输出结果为true。

除了使用比较运算符“==”,在C#中最常见的比较字符串的方法还有Compare、CompareTo和Equals方法等,这些方法都归属于String类。下面对这3种方法进行详细的介绍。

1.Compare方法

Compare方法用来比较两个字符串是否相等,它有很多个重载方法,其中最常用的两种方法如下。

        Int compare(string strA, string strB)
        Int Compare(string strA, string strB, bool ignorCase)

strA和strB:代表要比较的两个字符串。

ignorCase:是一个布尔类型的参数,如果这个参数的值是true,那么在比较字符串时就忽略大小写的差别。Compare方法是一个静态方法,所以在使用时,可以直接引用。

【例5.8】创建一个控制台应用程序,声明两个字符串变量,然后使用Compare方法比较两个字符串是否相等,代码如下。(实例位置:光盘\TM\sl\5\3)

        static void Main(string[] args)
        {
            string Str1="芸烨湘枫";                           //声明一个字符串Str1
            string Str2="用一生下载你";                        //声明一个字符串Str2
            Console.WriteLine(String.Compare(Str1, Str2));   //输出字符串Str1与Str2比较后的返回值
            Console.WriteLine(String.Compare(Str1, Str1));   //输出字符串Str1与Str1比较后的返回值
            Console.WriteLine(String.Compare(Str2, Str1));   //输出字符串Str2与Str1比较后的返回值
            Console.ReadLine();
        }

程序的运行结果为:

        1
        0
        -1

注意 比较字符串并非比较字符串长度的大小,而是比较字符串在英文字典中的位置。比较字符串按照字典排序的规则,判断两个字符串的大小。在英文字典中,前面的单词小于在后面的单词。

2.CompareTo方法

CompareTo方法与Compare方法相似,都可以比较两个字符串是否相等,不同的是CompareTo方法以实例对象本身与指定的字符串作比较,其语法如下。

        public int CompareTo(string strB)

【例5.9】对字符串stra和字符串strb进行比较,代码如下。

        stra.CompareTo(strb)

如果stra的值与strb的值相等则返回0;如果stra的值大于strb的值,则返回1;否则返回-1。

【例5.10】创建一个控制台应用程序,使用CompareTo方法比较两个字符串,代码如下。(实例位置:光盘\TM\sl\5\4)

        static void Main(string[] args)
        {
            string Str1="芸烨湘枫";                           //声明一个字符串Str1
            string Str2="用一生下载你";                        //声明一个字符串Str2
            Console.WriteLine(Str1.CompareTo(Str2));         //输出Str1与Str2比较后的返回值
            Console.ReadLine();
        }

由于字符串Str1在字典中的位置比字符串Str2的位置靠前,所以运行结果为1。

3.Equals方法

Equals方法主要用于比较两个字符串是否相同,如果相同返回值是true,否则为false,其常用的两种方式的语法如下。

        public bool Equals(string value)
        public static bool Equals(string a, string b)

value:是与实例比较的字符串。

a和b:是要进行比较的两个字符串。

【例5.11】创建一个控制台应用程序,声明两个字符串变量,然后使用Equals方法比较两个字符串是否相同,代码如下。(实例位置:光盘\TM\sl\5\5)

        static void Main(string[] args)
        {
            string Str1="芸烨湘枫";                         //声明一个字符串Str1
            string Str2="用一生下载你";                      //声明一个字符串Str2
            Console.WriteLine(Str1.EquaIs(Str2));          //用Equals方法比较字符串Str1和Str2
            Console.WriteLine(String.EquaIs(Str1, Str2));  //用Equals方法比较字符串Str1和Str2
            Console.ReadLine();
        }

程序的运行结果为:

        false
        false

说明 Equals方法执行顺序(区分大小写和区域性)比较。

5.2.4 格式化字符串

视频讲解:光盘\TM\lx\5\05格式化字符串.mp4

在C#中,String类提供了一个静态的Format方法,用于将字符串数据格式化成指定的格式,其语法格式如下。

        Public static string Format(string format, object obj);

format:用来指定字符串所要格式化的形式。

obj:要被格式化的对象。

说明 format参数由零或多个文本序列与零或多个索引占位符混合组成,其中索引占位符称为格式项,它们与此方法的参数列表中的对象相对应。格式设置过程将每个格式项替换为相应对象值的文本表示形式。格式项的语法是{索引[,对齐方式][:格式字符串]},它指定了一个强制索引、格式化文本的可选长度和对齐方式,以及格式说明符字符的可选字符串,其中格式说明符字符用于控制如何设置相应对象的值的格式。

【例5.12】创建一个控制台应用程序,声明两个string类型的变量strA和strB,然后使用Format方法格式化这两个string类型变量,最后输出格式化后的字符串,代码如下。(实例位置:光盘\TM\sl\5\6)

        static void Main(string[] args)
        {
            string StrA="用一生下载你";                                     //声明字符串StrA
            string StrB="永不放弃";                                        //声明字符串StrB
            string newstr=String.Format("{0}, {1}! ! ! ", StrA, StrB);                  //格式化字符串
            Console.WriteLine(newstr);                                    //输出结果
            Console.ReadLine();
        }

程序的运行结果为“用一生下载你,永不放弃!! ! ”。

如果希望日期时间按照某种格式输出,那么可以使用Format方法将日期时间格式化成指定的格式。在C#中,已经提供了一些用于日期时间的格式规范,具体描述如表5.3所示。

表5.3 用于日期时间的格式规范

下面通过一个实例,演示如何使用日期时间的格式规范,以格式规范D为例。

【例5.13】创建一个控制台应用程序,声明一个DateTime类型的变量dt,用于获取系统的当前日期时间,然后通过使用格式规范D将日期时间格式化为“YYYY年MM月dd日”的格式,代码如下。(实例位置:光盘\TM\sl\5\7)

        static void Main(string[] args)
        {
            DateTime dt=DateTime.Now;                                  //获取系统当前日期
            string strB=String.Format("{0:D}", dt);                    //格式化成短日期格式
            Console.WriteLine(strB);                                   //输出日期
            Console.ReadLine();
        }

程序的运行结果为“2012年2月22日”。

互动练习:尝试使用C#制作一个商品金额大小写转换的程序,具体要求为:在一个文本框中输入小写的金额,单击“转换”按钮,自动转换为大写的金额表示方法。

5.2.5 截取字符串

视频讲解:光盘\TM\lx\5\06截取字符串.mp4

String类提供了一个Substring方法,该方法可以截取字符串中指定位置和指定长度的子字符串,其语法格式如下。

        public string Substring(int startIndex, int length)

startIndex:子字符串的起始位置的索引。

length:子字符串中的字符数。

【例5.14】创建一个控制台应用程序,声明两个string类型的变量StrA和StrB,并将StrA初始化为“用一生下载你”,然后使用Substring方法从索引1开始截取4个字符,赋值给StrB,并输出StrB,代码如下。(实例位置:光盘\TM\sl\5\8)

        static void Main(string[] args)
        {
            string StrA="用一生下载你";                           //声明字符串StrA
            string StrB="";                                     //声明字符串StrB
            StrB=StrA.Substring(1, 4);                          //截取字符串
            Console.WriteLine(StrB);                            //输出截取后的字符串
            Console.ReadLine();
        }

程序的运行结果为“一生下载”。

说明 在用Substring方法截取字符串时,如果length参数的长度大于截取字符串的长度,将从起始位置的索引处截取之后的所有字符。

闯关训练:从一个全路径的字符串中分离出文件路径、文件名及扩展名等信息。

5.2.6 分割字符串

视频讲解:光盘\TM\lx\5\07分割字符串.mp4

String类提供了一个Split方法,用于分割字符串,此方法的返回值是包含所有分割子字符串的数组对象,可以通过数组取得所有分割的子字符串,其语法格式如下。

        public string[ ] split(params char[ ] separator);

separator:是一个数组,包含分隔符。

【例5.15】创建一个控制台应用程序,声明一个string类型变量StrA,初始化为“用^一生#下载,你”,然后通过Split方法分割变量StrA,并输出分割后的字符串,代码如下。(实例位置:光盘\TM\ sl\5\9)

        static void Main(string[] args)
        {
            string StrA="用^一生#下载,你";                              //声明字符串StrA
            char[] separator={'^', '#', ', '};                         //声明分割字符的数组
            String[] splitstrings=new String[100];                     //声明一个字符串数组
            splitstrings=StrA.SpIit(separator);                        //分割字符串
            for(int i = 0; i < splitstrings.Length; i++)
            {
                Console.WriteLine("item{0}:{1}", i, splitstrings[i]);
            }
            Console.ReadLine();
        }

程序的运行结果为:

        item0:用
        item1:一生
        item2:下载
        item3:你

5.2.7 插入和填充字符串

视频讲解:光盘\TM\lx\5\08插入字符串.mp4

1.插入字符串

String类提供了一个Insert方法,用于向字符串的任意位置插入新元素,其语法格式如下。

        public string Insert(int startIndex, string value);

startIndex:用于指定所要插入的位置,索引从0开始。

value:指定所要插入的字符串。

【例5.16】创建一个控制台应用程序,声明3个string类型的变量str1、str2和str3。将变量str1初始化为“下载”,然后使用Insert方法在字符串str1的索引0处插入字符串“用一生”,并赋给字符串str2,最后在字符串str2的索引5处插入字符串“你”,赋给字符串str3,并输出str3,代码如下。(实例位置:光盘\TM\sl\5\10)

        static void Main(string[] args)                  //Main方法
        {
            string str1="下载";                           //声明字符串变量str1并赋值为“下载”
            string str2;                                 //声明字符串变量str2
            str2=str1.Insert(0, "用一生");                //使用Insert方法向字符串str1中插入字符串
            string str3=str2.Insert(5, "你");             //使用Insert方法向字符串str2中插入字符串
            Console.WriteLine(str3);                     //输出字符串变量str3
            Console.ReadLine();
        }

程序的运行结果为“用一生下载你”。

说明 如果想要在字符串的尾部插入字符串,可以用字符串变量的Length属性来设置插入的起始位置。

2.填充字符串

String类提供了PadLeft/PadRight方法用于填充字符串,PadLeft方法在字符串的左侧进行字符填充,而PadRight方法在字符串的右侧进行字符填充。PadLeft方法的语法格式如下。

        public string PadLeft(int totalWidth, char paddingChar)

PadRight方法的语法格式如下。

        public string PadRight(int totalWidth, char paddingChar)

totalWidth:指定填充后的字符串长度。

paddingChar:指定所要填充的字符,如果省略,则填充空格符号。

【例5.17】创建一个控制台应用程序,声明3个string类型的变量str1、str2和str3。将str1初始化为“*^__^*”,然后使用PadLeft方法在str1的左侧填充字符“(”,并赋给字符串str2。最后使用Pad Right方法在字符串str2的右侧填充字符“)”,最后得到字符串“(*^__^*)”,赋给字符串str3,并输出字符串str3,代码如下。(实例位置:光盘\TM\sl\5\11)

        static void Main(string[] args)
        {
            string str1="*^__^*";                         //声明一个字符串变量str1
            //声明一个字符串变量str2,并使用PadLeft方法在str1的左侧填充字符“(”
            string str2 = str1.PadLeft(7, '(');
            //声明一个字符串变量str3,并使用PadRight方法在str2的右侧填充字符“)”
            string str3 = str2.PadRight(8, ')');
            Console.WriteLine("补充字符串之前:"+str1);      //输出字符串str1
            Console.WriteLine("补充字符串之后:"+str3);      //输出字符串str2
            Console.ReadLine();
        }

程序的运行结果为:

        补充字符串之前:*^__^*
        补充字符串之后:(*^__^*)

5.2.8 删除字符串

视频讲解:光盘\TM\lx\5\09删除字符串.mp4

String类提供了一个Remove方法,用于从一个字符串的指定位置开始,删除指定数量的字符,其语法格式如下。

        Public String Remove( int startIndex);
        Public String Remove( int startIndex, int count);

startIndex:用于指定开始删除的位置,索引从0开始。

count:指定删除的字符数量。

注意 参数count的值不能为0或是负数(startIndex参数也不能为负数),如果为负数,将会引发ArgumentOutOfRangeException异常(当参数值超出调用的方法所定义的允许取值范围时引发的异常);如果为0,则删除无意义,也就是没有进行删除。

此方法有两种语法格式,第一种格式删除字符串中从指定位置到最后位置的所有字符。第二种格式从字符串中指定位置开始删除指定数目的字符。

【例5.18】创建一个控制台应用程序,声明一个string类型的变量str1,并初始化为“用一生下载你”,然后使用Remove方法的第一种语法格式删除从索引3后面的所有字符,代码如下。(实例位置:光盘\TM\sl\5\12)

        static void Main(string[] args)                      //Main方法
        {
            string str1="用一生下载你";                        //声明一个字符串变量str1
            //声明一个字符串变量str2,并使用Remove方法从字符串str1的索引3处开始删除
            string str2=str1.Remove(3);
            Console.WriteLine(str2);                         //输出字符串str2
            Console.ReadLine();
        }

程序的运行结果为“用一生”。

下面再通过实例演示如何使用Remove方法的第二种语法格式。

【例5.19】创建一个控制台应用程序,声明一个string类型变量str1,并初始化为“芸烨湘枫”,然后使用Remove方法的第二种语法格式从索引位置1开始,删除两个字符,代码如下。(实例位置:光盘\TM\sl\5\13)

        static void Main(string[] args)                      //Main方法
        {
            string str1="芸烨湘枫";                           //声明一个字符串变量str1,并初始化
            //声明一个字符串变量str2,并使用Remove方法从字符串str1的索引1处开始删除两个字符
            string str2=str1.Remove(1,2);
            Console.WriteLine(str2);                         //输出字符串str2
            Console.ReadLine();
        }

程序的运行结果为“芸枫”。

5.2.9 复制字符串

视频讲解:光盘\TM\lx\5\10复制字符串.mp4

String类提供了Copy和CopyTo方法,用于将字符串或子字符串复制到另一个字符串或Char类型的数组中。

1.Copy方法

创建一个与指定的字符串具有相同值的字符串的新实例,其语法格式如下。

        public static string Copy(string str)

str:是要复制的字符串。

返回值:与str具有相同值的字符串。

【例5.20】创建一个控制台应用程序,声明一个string类型的变量stra,并初始化为“芸烨湘枫”,然后使用Copy方法复制字符串stra,并赋给字符串strb,代码如下。(实例位置:光盘\TM\sl\5\14)

        string stra="芸烨湘枫";                              //声明一个字符串变量stra并初始化
        string strb;                                        //声明一个字符串变量strb
        //使用String类的Copy方法,复制字符串stra并赋值给strb
        strb=String.Copy(stra);
        Console.WriteLine(strb);                            //输出字符串strb
        Console.ReadLine();

程序的运行结果为“芸烨湘枫”。

2.CopyTo方法

CopyTo方法的功能与Copy方法基本相同,但是CopyTo方法可以将字符串的某一部分复制到另一个数组中,其语法格式如下。

        Public void CopyTo(int sourceIndex, char[ ]destination, int destinationIndex, int count);

参数说明如表5.4所示。

表5.4 CopyTo方法的参数及说明

注意 当参数sourceIndex、destinationIndex或count为负数,或者参数count大于从startIndex到此实例末尾的子字符串的长度,或者参数count大于从destinationIndex到destination末尾的子数组的长度时,则引发ArgumentOutOfRangeException异常(当参数值超出调用的方法所定义的允许取值范围时引发的异常)。

下面通过实例演示如何使用CopyTo方法。

【例5.21】创建一个控制台应用程序,声明一个string类型变量str1,并初始化为“用一生下载你”。然后声明一个Char类型的数组str,使用CopyTo方法将“一生下载”复制到数组str中,代码如下。(实例位置:光盘\TM\sl\5\15)

        static void Main(string[] args)
        {
            string str1="用一生下载你";                       //声明一个字符串变量str1并初始化
            char[] str=new char[100];                       //声明一个字符数组str
            //将字符串str从索引1开始的4个字符串复制到字符数组str中
            str1.CopyTo(1, str,0,4);
            Console.WriteLine(str);                         //输出字符数组中的内容
            Console.ReadLine();
        }

程序的运行结果为“一生下载”。

5.2.10 替换字符串

视频讲解:光盘\TM\lx\5\11删除字符串.mp4

String类提供了一个Replace方法,用于将字符串中的某个字符或字符串替换成其他的字符或字符串,其语法格式如下。

        public string Replace(char OChar, char NChar)
        public string Replace(string OValue, string NValue)

参数说明如表5.5所示。

表5.5 Replace方法的参数及说明

第一种语法格式主要用于替换字符串中指定的字符,第二种语法格式主要用于替换字符串中指定的字符串,下面通过实例演示这两种语法格式的用法。

【例5.22】创建一个控制台应用程序,声明一个string类型变量a,并初始化为“one world, one dream”。然后使用Replace方法的第一种语法格式将字符串中的“, ”替换成“*”,最后使用Replace方法的第二种语法格式将字符串中的“one world”替换成“One World”,代码如下。(实例位置:光盘\TM\sl\5\16)

        static void Main(string[] args)
        {
            string a="one world, one dream";               //声明一个字符串变量a并初始化
            //使用Replace方法将字符串a中的“, ”替换为“*”,并赋值给字符串变量b
            string b=a.RepIace(', ', '*');
            Console.WriteLine(b);                          //输出字符串变量b
            //使用Replace方法将字符串a中的“one world”替换为“One World”
            string c=a.RepIace("one world", "One World");
            Console.WriteLine(c);                          //输出字符串变量c
            Console.ReadLine();
        }

程序的运行结果为:

        one world*one dream
        One World, one dream

互动练习:尝试使用C#制作一个对字符串进行加密与解密的程序,主要调用已有类库中的ToEncrypt方法和ToDecrypt方法实现。