- C#从入门到精通(第4版)
- 明日科技
- 5798字
- 2020-11-28 16:23:19
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方法实现。