2.2 字符与字符串处理
字符和字符串类型是编程中最常用的数据类型。编程过程中会涉及字符串的提取、拆分等操作。
■2.2.1 字符变量
字符变量的声明格式为:
char字符变量;
例如,char MyChar ='d'就声明了一个字符变量并赋初值。表达一个字符常量,必须加上单引号,而不是双引号。
字符变量经常用来代表ASCII码表中的字符。上述的'd'转换为整型数就是100, ASCII码表可以用下面的公式产生。
创建一个名为“WindowsFormsApplication20160606”的窗体应用程序,在窗体上放置一个listbox列表框控件,然后在窗体的Load事件中写入如下代码:
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 this.listBox1.Items.Clear(); 4 for (int i = 0; i <= 127; i++) 5 { 6 char a = Convert.ToChar(i); 7 this.listBox1.Items.Add(i.ToString() +"\t" +a); 8 } 9 }
上述代码把0~127这128个字符的代码值和符号添加到列表框中,运行效果如图2.1所示。
此外,字符变量可以和整型变量直接进行运算。比如下面两行代码,变量j等于650,原因是abc是字符变量,存储了常量A,而A的ASCII码值是65,因此j是65和10的乘积。
1 char abc='A'; 2 int j = abc * 10;
图2.1 字符变量
■2.2.2 字符串变量
一个字符串变量可以存储一个字符串,而字符串也可以看作是字符组成的数组。例如,下面的代码中m是一个字符串变量,而m[2]则自动转换为一个字符 变量赋给c,那么c将是字符'T'。
1 string m = "VSTO"; 2 char c =m[2];
使用这个原理,就可以遍历字符串了:
1 public void遍历字符串中的字符() 2 { 3 char c; 4 string s = "microsoft office"; 5 for (int i = 0; i < s.Length; i++) 6 { //遍历字符串中的每一个字符 7 c = s[i]; 8 result += "\n" + c; 9 } 10 }
与此对应的VBA代码如下:
1 Public Sub遍历字符串中的字符() 2 Dim c As String, s As String 3 s = "microsoft office" 4 result = "" 5 For i = 1 To Len(s) 6 '遍历字符串中的每一个字符 7 c = Mid(s, i, 1) 8 result = result & vbNewLine & c 9 Next i 10 End Sub
■2.2.3 转义字符
C#中有一些特殊的转义字符。在代码中,转义字符都以反斜杠开头,如表2.3所示。
表2.3 C#转义字符
假如要在对话框中输出两行文字,一行是Microsoft,另一行是Office,可以使用如下代码:
MessageBox.Show("Microsoft\rOffi ce");
运行结果如图2.2所示。
在代码中我们可以看到\r是一个转义字符,产生了回车符。再比如我们要输出计算机中的一个路径“F:\VSTO\VSTOBOOK”,直接这样输入代码中会产生错误,因此需要把源字符串中的每一个反斜杠再加一个反斜杠。
图2.2 认识转义字符
MessageBox.Show("F:\\VSTO\\VSTOBOOK");
与转义字符相反,使用@可以非转义,即原样输出。例如上述输出路径的问题,修改代码为:
MessageBox.Show(@"F:\VSTO\VSTOBOOK");
也可以输出正确的路径。
当然我们可以想到,下面的这行代码将原样输出\r,而不是换行。
MessageBox.Show(@"Microsoft\rOffi ce");
在编程的过程中,会经常使用\t分隔水平的数据,使用\r实现换行输出。
窗体上放置一个richtextbox文本框控件,在窗体的Load事件中输入如下代码:
1 string result=""; 2 result += "山东省\t济南\r"; 3 result += "安徽省\t合肥\r"; 4 result += "黑龙江省\t哈尔滨\r"; 5 result += "内蒙古自治区\t呼和浩特\r"; 6 this.richTextBox1.Text = result;
运行结果如图2.3所示。
图2.3 使用制表符
通过这个示例,我们可以清晰地看到转义字符所起的作用。
■2.2.4 字符串连接
使用+运算符实现多个字符串的连接,如果连接的各个数据都不是字符串,则需要事先使用ToString()方法强制转换为字符串后再连接。
1 string s1 = "Microsoft"; 2 string s2 = s1 + "Office";
下面的两行代码中,s3是两个浮点数相加的结果转换为字符串,结果显示5.858,而s4是空字符串与两个数字相连,因此输出为2.7183.14。读者仔细思考其原理。
1 string s3 = (2.718 + 3.14).ToString(); 2 string s4 = "" + 2.718 + 3.14;
■2.2.5 子字符串
在VB或VBA中使用Left、Right以及Mid函数可以提取字符串中的一部分,在C#中可以使用SubString函数达到同样的目的。SubString的用法和VB中的Mid用法非常类似。
1 string s1 = "Microsoft"; 2 string s5= s1.SubString(3, 4);
上述代码中,提取字符串s1,从第三个字符起连续提取4个,因此字符串s5将会等于“roso”。
C#使用IndexOf函数可以判断字符串中是否包含另一个子字符串。
1 string s1 = "Microsoft"; 2 int p = s1.IndexOf("so");
上述代码,目的是监测字符串s1中是否包含“so”,返回的结果是5,因为s1中包含这个子字符串,而且位于第5个位置。反之,如果未找到子字符串,则返回-1。
■2.2.6 格式化字符串
String.Format函数的语法为:
String Format(要输出的字符串,变量列表)
要输出的字符串中,允许使用{数字}这样的占位符,输出时占位符位置用变量列表中相应位置的变量来替换,具体看下面的例子。
1 public void格式化字符串() 2 { 3 string s0="format", s1="micro", s2="soft", s3 ="visual" , s4="studio"; 4 result =String.Format("result is {0} {3} {4}", s0, s1, s2, s3, s4); 5 }
上面这个例子依次声明并赋值了5个字符串变量。注意第4行代码,依次把5个变量置于Format函数的参数中,要返回的是双引号括起来的部分,遇到{n}就表示该位置用第n个字符串变量代替,因此result返回的结果是:result is format visual studio。
■2.2.7 字符串的替换
C#中使用Replace函数进行字符串的替换。
Replace函数有以下两种用法:
①字符替换。语法格式如下:
Replace(旧字符,新字符)
②字符串替换。语法格式如下:
Replace(旧字符串,新字符串)
1 string s = "Microsoft Office"; 2 string t = s.Replace('o', '%'); 3 string u = s.Replace("oso", "微软公司");
上述代码中,变量t返回“Micr%s%ft Office”,变量u返回“Micr微软公司ft Office”。
■2.2.8 字符串与数组
在编程实际应用中,经常会将一个字符串按照某个特定的符号进行分割。C#可以使用Split函数实现字符串分割。
1 public void字符串与数组() 2 { //字符串转数组; 3 string source = "micro soft visual studio"; 4 string[] arr = source.Split(' '); 5 foreach (string v in arr) 6 { result += v + "\n"; } 7 //数组转字符串 8 result += string.Join("+", arr); 9 }
上述代码中字符串数组arr用来存储使用空格分割开的source元素。反过来,可以使用Join函数把字符串数组的每一个元素用特定的符号连接起来,成为一个新的字符串。
具有同样功能的VBA代码如下:
1 Public Sub字符串与数组() 2 '字符串转数组 3 Dim source As String, arr, v 4 source = "micro soft visual studio" 5 arr = Split(source, " ") 6 For Each v In arr 7 result = result & v & vbNewLine 8 Next v 9 10 Dim s(1 To 3) As String 11 s(1) = "excel" 12 s(2) = "word" 13 s(3) = "ppt" 14 result = result & Join(s, "+++") 15 End Sub