520 likes | 661 Views
第 5 章 数据的输入和输出. (时间: 1.5 次课, 3 学时). 第 5 章 数据的输入和输出.
E N D
第5章 数据的输入和输出 (时间:1.5次课,3学时)
第5章 数据的输入和输出 • 输入/输出是程序得以实际应用的必要措施,在程序中实现数据的输入和输出也是每个程序员必须掌握的基本编程技术。在前面各章节的举例中,我们都已经使用了C#语言的部分输入/输出系统,其中用得最多的是.NET类库中Console类的一个方法Console. WriteLine(),这个方法是将在程序中生成的数据或信息输出到控制台(Console)中。另外,程序不光是要向控制台输出数据,还要从控制台读取输入的数据,或者要求输出的数据具有一定的格式。一般说来,数据的输入/输出(I/O)方式有两种:控制台I/O和文件I/O。C#的I/O系统非常庞大,也有控制台I/O和文件I/O两大部分,本章只介绍控制台I/O部分,而文件I/O部分将在后续章节详细介绍。 • C#的控制台I/O主要是通过命名空间System中的类Console来实现的,该类给出了标准的输入和输出的方法,这些方法可用于从控制台读写字符。 • 本章介绍的内容不是任何C#语法,而是.NET框架中常用的控制台输入/输出的类和方法的使用格式。 • 本章学习重点: • 掌握在控制台中输入/输出数据的方法 • 掌握输出格式化数据的方法 • 掌握处理字符串的方法
第5章 数据的输入和输出 • 5.1 控制台输入 • 5.2 控制台输出 • 5.3 处理字符串的方法
5.1 控制台输入 • 5.1.1 Console.Read()方法 • 5.1.2 Console.ReadLine()方法
5.1 控制台输入 • System.Console类的Read()和ReadLine()方法可用来实现控制台输入,本节我们将详细介绍如何使用这两种方法获取输入。
5.1.1 Console.Read()方法 • Read()方法每次从输入流(控制台)中读取一个字符,直到收到Enter键才返回。将接收的字符以int型(32位整数)值返回给变量;如果输入流中没有数据,则返回-1。 • Read()方法是一个静态方法,我们可以直接通过类名Console调用它,调用的格式为Console.Read。Read()方法的原型为:public static int Read()。 • 如果我们输入了多个字符,然后按Enter键(此时输入流中将包含用户输入的字符,加上Enter键和换行符‘\r\n’),则Read()方法只返回用户输入的第一个字符。但我们可通过对程序的循环控制,多次调用Read()方法来获取所有输入的字符。 • Read()方法返回给变量的数据的类型是32位整数,如果需要得到输入的字符,则必须通过数据类型显式转换才可以得到相应的字符。
5.1.1 Console.Read()方法 • 【例5.1】Read()方法的使用。 • using System; • class MyRead1 • { • public static void Main() • { • int a; • char ch; • Console.Write("请从键盘输入一个字符:"); • a=Console.Read(); //程序运行到Read方法会暂停,直到用户在控制台中按任意键 • ch=(char)a; //显式类型转换 • Console.WriteLine(a); • Console.WriteLine(ch); • } • } • 程序运行结果: • 请从键盘输入一个字符:a (回车) • 97 • a
5.1.1 Console.Read()方法 • 【例5.2】通过Read()方法从控制台接收用户输入的一系列字符,然后把用户输入的内容显示出来。 • using System; • class MyRead2 • { • public static void Main(string[ ] args) • { • string buf ; • Console.Write("请输入字符串(按Enter键接收输入,按x键退出程序):"); • buf=""; • while(true) • { • int c= Console.Read(); //接收一个字符 • if((char)c= ='x' && (char)c= ='X')return; //按下'x'或'X'键,退出本程序 • if (c= =-1)Console.WriteLine("不输入"); • buf+=(char)c; //将字符组成字符串 • if(c= ='\n')break; • } • Console.Write("用户输入的内容为:"); • Console.WriteLine("{0}", buf); • } • } • 在本程序中,可以一次输入单个字符,也可以一次输入多个字符。当按下x或X键再按下Enter键后将会退出本程序。
5.1.2 Console.ReadLine()方法 • ReadLine()方法用于从控制台中一次读取一行字符串,直到遇到Enter键才返回读取的字符串。但此字符串中不包含Enter键和换行符(‘\r\n’)。如果没有收到任何输入,或接收了无效的输入,那么ReadLine()方法将返回null。 • ReadLine()方法也是一个静态方法,可以直接通过类名Console来调用它,调用的格式为Console.ReadLine。 • ReadLine()方法的原型为:public static string ReadLine()
5.1.2 Console.ReadLine()方法 • 【例5.3】使用ReadLine()方法。 • using System; • class MyReadline • { • public static void Main() • { • int i; • string str; • Console.Write("请输入你的姓名:"); • str= Console.ReadLine(); • Console.Write("用户的姓名为:"); • Console.WriteLine(str); • } • } • 程序的运行结果: • 请输入你的姓名:王红 (回车) • 用户的姓名为:王红
5.2 控制台输出 • 5.2.1 数据的格式化 • 5.2.2 格式化说明符
5.2 控制台输出 • 在前述的各章节中,我们同样也多次使用了 Console类的Write()和WriteLine()方法来输出程序的计算结果。日常生活中,有时我们不仅仅要求程序简单地输出数据,还要求能输出具有一定格式的数据,以丰富我们应用程序的应用需求。
5.2.1 数据的格式化 • 在日常生活中,各行各业的数据表示形式有多种。例如,一个十进制数字965840,可能有以下表示形式: • 表示人民币:¥9,658.40 • 表示美元:$9,658.40 • 用于科学计算:9.65840×105,在C#中表示为9.65840E5 • 可见,对于一个程序来说,它的计算结果只是一个无任何语义的数字。所以如果希望一个应用程序的计算结果在输出时能反映出它的应用特征,则必须在程序的输出语句中给出所需数据格式的转换控制。C#语言具有将数字在不同的表示形式之间相互转换的功能 ——数据的格式化。 • 数据的格式化是指通过程序(方法),将数据的表现形式转换为一定样式的过程。C#语言是通过.NET类库方法、格式化字符串以及其他的控制信息共同完成的。
5.2.1 数据的格式化 • 一般实现把数字转换为指定格式的字符串输出的基本方式有3种: • Write()和WriteLine()方法可以直接把数值类型变量的值,转换成字符串输出到控制台中,并可使用格式说明符来控制输出的数据格式。 • Write()方法用来向控制台输出一条信息,并且光标仍在输出信息的末尾。一般Write()方法中有以下两种常用的形式: • public static void Write(数值数据类型 变量); //直接输出变量的值 • public static void Write("{N[, M][:Yn]}", 变量1, 变量2…); • 其中:N——表示输出变量的序号。N为0对应输出的第1个变量,N为1则对应输出的第2个变量,依次类推。[, M]——可选项。M表示输出的变量在控制台中所占据的字符个数,如果该数字为负数,则输出按照左对齐方式;如果该数字为正数,则输出按照右对齐的方式。[:Yn]——可选项。其中Y是格式化字符串,它指的是数据的输出格式说明符,将在5.2.2节中给出。n为一个正整数。表示了数据的精度范围(有效数字范围),它用于控制当前数据在格式化后表现出来的有效数字个数。 • 例如: • int a=32767; • double d=456.56789; • Console.Write("a=0x{0, 8:X}\t d={1, 10:F3}", a, d); • Console.Write("a=0x{0, -8:X}\t d={1, -10:F3}", a, d); • 输出结果: • a=0x 7fff d= 456.568a=0x7fff d=456.568 • 本例中的格式说明符X和F在5.2.2节中给出说明。
5.2.1 数据的格式化 • WriteLine()方法用来向控制台产生一行信息,并在信息的尾部自动添加“\r\n”操作符,即输出信息后光标自动移到下一新行。同Write()方法类似,WriteLine方法有以下两种常用的形式: • public static void WriteLine(数值数据类型 变量); • public static void WriteLine("{N[, M][:Y]}", 变量1, 变量2…); • WriteLine()方法的参数与Write()方法的参数意义一样。 • 例如: • int a=32767; • double d=456.56789; • Console.WriteLine("a=0x{0, 8:X}\td={1, 10:F3}", a, d); • Console.WriteLine("a=0x{0, -8:X}\td={1, -10:F3}", a, d); • 输出结果: • a=0x 7fff d= 456.568 • a=0x7fff d=456.568 • 可见此例输出结果与Write()方法不同的是每一个WriteLine()方法输出一行信息后自动换行。
5.2.1 数据的格式化 • 调用ToString方法中使用格式说明符。ToString方法是System.Object类中的一个方法,此方法可以将变量的值转换为由数字、数学符号等组成的字符串。由于所有的类都是从Object类中派生出来的,因此,所有的对象都可以使用ToString方法,例如各种基本数据类型(int32、 int64)等。 • ToString方法的调用格式为:类对象名称.ToString(“格式说明符”) • 例如: • int var=8769; • string str=var. ToString("C"); //使用ToString()方法,将整型数转换为金额格 • 式表示输出结果将是:¥8,769.00 • 其中格式说明符C是用于金额的格式说明符,我们将在5.2.2节中介绍。 • 调用String类的Format静态方法。Format()方法可用于将信息格式化为一个新的字符串。由于Format()方法是静态的,因此可以以String.Format的方式直接调用。Format方法常用的使用格式: • string str=String.Format("{N[, M][:Yn]}", 变量1, 变量2, ….); • 其中:str是格式化后得到的字符串;其他的参数与Write和WriteLine方法中的参数相同。Format()方法还有两种使用格式可参阅 MSDN文档。
5.2.1 数据的格式化 • 【例5.4】基本的格式化方法。 • u sing System; • class MyFormat • { • public static void Main() • { • int a=34567; • Console.WriteLine("使用WriteLine格式化数据:"); • Console.WriteLine("\n{0:C}\n{0:C4}", a); • Console.Write Line("\n{0:F}\n{0:F4}", a); • Console.WriteLine("使用ToString格式化数据:"); • string str1=a.ToString("c"); • string str2=a.ToString("c3"); • Console.WriteLine (str1); • Console.WriteLine (str2); • Console.WriteLine("使用String.Format格式化数据:"); • string str4=String.Format("我们也能使用String.Format格式化数据:"); • string str5=String.Format("\n{0:c}\n{0:c0}", a); • Console.WriteLine(str4); • Console.WriteLine(str5); • } • }
5.2.1 数据的格式化 • 程序运行结果: • 使用WriteLine格式化数据: • ¥34,567.00 • ¥34,567.0000 • 34567.00 • 34567.0000 • 使用ToString格式化数据: • ¥34,567.00 • ¥34,567.000 • 使用String.Format格式化数据: • ¥34,567.00 • 我们也能使用String.Format格式化数据: • ¥34,567 • 在本例中将变量a中的数字格式化为金额、小数,其中的说明符将在5.2.2节中详细 介绍。
5.2.2 格式化说明符 • .NET框架体系规定可以使用两种格式进行数据的格式化:一种是由系统定义的标准格式,另一种是用户自定义格式。这两种格式主要包含了各种用于格式化数据的格式控制字符,使用这些控制字符组成所需的数据格式,然后由5.2.1节中所述3种格式化方式即可实现数据的格式化了。 • 1. 标准格式说明符 • 标准格式说明符定义了人们常用的8种数据表示形式,如表5.1所示。
5.2.2 格式化说明符 表5.1 标准格式说明符
5.2.2 格式化说明符 • 标准格式的一般形式是:{N[, M][:Yn]} • 其中: • N表示输出变量的序号。N为0对应输出的第1个变量,N为1则对应输出的第2个变量,依次类推。 • [, M]是可选项。M表示输出的变量在控制台中所占据的字符个数,如果该数字为负数,则输出按照左对齐方式;如果该数字为正数,则输出按照右对齐的方式。 • [:Yn]是可选项。Y是格式化说明符,它指的是数据的输出格式说明符(如表5.1所示),这些字符是由系统定义的,它们基本涵盖了.NET框架定义的所有数值类型数据的表现形式。 • n为一个正整数,表示了数据的精度范围(有效数字范围),它用于控制当前数据在格式化后表现出来的有效数字个数。 • 货币金额格式字符“C或c”用来组成将数据转换为货币金额格式的字串,在字符“C或c”后面的数字定义了货币金额数据小数点后保留的数字个数,如果没有定义任何数字,则默认小数点后保留2位数字。 • 例如: • int a=123456; • double d=1234.5678; • string str1=String.Format("{0:c}",a); //得到的字串是"¥123,456.00" • string str2=String.Format("{0:c}", d); //得到的字串是"¥1,234.57" • string str3=String.Format("{0:c4} ", a); //得到的字串是 • "¥123,456.0000" • string str4=String.Format("{0:c4}", d); //得到的字串是"¥1,234.5678" • string str5=d.ToString("c"); //得到的字串是"¥1,234.57" • string str6=d.ToString("c4"); //得到的字串是"¥1,234.5678"
5.2.2 格式化说明符 • 提示:所显示的货币金额符号同用户使用的操作系统有关,如果本例在Windows 2000 Professional英文版中运行,则结果中显示的 货币符号是$;如果我们使用的是中文版操作系统,则将会显 示的货币符号可能就是¥。
5.2.2 格式化说明符 • 整数数据格式字符“D或d”用来组成将数据表示为十进制整数数据的格式化字符串。字符“D或d”后面的数字规定了要表示的数据位数,如果这个数字小于整数数据的位数,则显示所有的整数位;如果这个数字大于整数数据的位数,则在整数数据的前面用数字“0”补足所有的位数。 • 例如: • int a=123456; • string str1=String.Format("{0:d}", a); //得到的字串是"123456" • string str2=String.Format("{0:d6 }", a); //得到的字串是"123456" • string str3= String.Format("{0:d7}", a); //得到的字串是"0123456" • string str4= a.ToString("d"); //得到的字串是"123456" • string str5= a.ToString("d7"); //得到的字串是"0123456" • 科学计数法格式字符“E或e”用来将数据转换为科学计数法形式。在字符“E或e”后面的数字用来规定科学计数法表示数据的小数点后数字的个数。如字符“E或e”后面没有数字,则显示7位有效数字。 • 例如: • int a=123456; • double d=1234.5678; • string str1=String.Format("{0:e}", a); //得到的字串是"1.234560e+005" • string str2=String.Format("{0:e}", d); //得到的字串是"1.234568e+003" • string str3=String.Format("{0:e4}",a); //得到的字串是"1.2346e+005" • string str4=String.Format("{0e4}", d); //得到的字串是"1.2346e+003" • string str5=a.ToString("E"); //得到的字串是"1.234560E+005" • string str6=d.ToString("E4"); //得到的字串是" 1.2346E+003" • 浮点数据格式字符“F或f”用来描述带有小数点的数据的显示形式。字符“F或f”后面的数字规定了小数点后的数据位数。如果没有指定数字,则数据默认保留两位小数,如果指定的数字大于数据本身小数部分的位数,则在小数部分数字的最后补“0”。
5.2.2 格式化说明符 • 自然数据格式字符“N或n”用来表示自然数据格式。这种数据格式将数据格式化成带逗号和小数点,即表示为“dd,ddd,ddd.dd”的形式。这种数字分组的表示形式多用于一些正规的场合,便于直观了解数据的大小量级。字符“N或n”后面的数字规定了数据格式中小数点后面的数字个数。 • int a=123456; • double d=1234.5678; • string str1=String.Format("{0:n}",a); //得到的字串是"123,456.00" • string str2=String.Format("{0:n}", d); //得到的字串是"1,234.57" • string str3=a.ToString("n4"); //得到的字串是"123,456.0000" • string str4=d.ToString("n4"); //得到的字串是"1,234.5678" • 十六进制数据格式字符“X或 x”用于将数据表示为十六进制格式。字符“X或 x”后面的数字表示了格式化数据的数字个数,其规定与整数数据格式类似。 • 例如: • int a=123456; • string str1=String.Format("{0: x}",a); //得到的字串是"1e240" • string str2=a.ToString ("x5"); //得到的字串是"1e240" • string str3=a.ToString ("x6 "); //得到的字串是"01e240" • string str4=a.ToString ("x7"); //得到的字串是"001e240" • 保持精度(来回转换)将数字从一种格式转换为另一种格式时,可能会降低精度。字符“R或r”用于将字符串转换为数字是保持其精度。使用该格式说明符后,运行时环境将尽可能保持原有数字的精度。
5.2.2 格式化说明符 • 2. 自定义数字格式说明符 • 有时候,需要更精确地按某种意图控制数字的格式,比如格式化驾驶证号或社会保险号时,可能想加入短划线;而对于电话号码,则想加入括号和短划线等,这时就需要使用一些自定义的格式说明符来实现所需的数据格式。表5.2所示为自定义数据格式说明符。
5.2.2 格式化说明符 表5.2 自定义数据格式说明符
5.2.2 格式化说明符 • 【例5.5】使用自定义说明符显示特殊数据格式(用WriteLine()方法实现输出)。 • using System; • using System.Globalization; • class CustomFormat1 • { • public static void Main() • { • int a=1234; • float b=12.34f; • // "0"格式化说明符 • Console.WriteLine("\n"0"格式化说明符:"); • Console.WriteLine ("{0}{0:0000000}", a); • Console.WriteLine ("{0}{0:0000000}", b); • //"#"格式化说明符 • Console.WriteLine("\n"#"格式化说明符:"); • Console.WriteLine ("{0}{0:0####}", a); • Console.WriteLine ("{0}{0:0####}", b); • //","格式化说明符 • Console.WriteLine("\n","格式化说明符:"); • Console.WriteLine ("{0}{0:0,,}", 1000000); //","用作倍增器 • Console.WriteLine ("{0}{0:##,###,##0}", 2000000); //","用作分隔符 • Console.WriteLine ("{0}{0:##,###,##0}", 3); • //"%"格式化说明符 • Console.WriteLine("\n"%"格式化说明符:"); • Console.WriteLine ("{0}{0:0%}", a); //将原数乘100% • Console.WriteLine ("{0}{0:0%}", b); • //单引号''格式化说明符 • Console.WriteLine("\n单引号格式化说明符:"); • Console.WriteLine ("{0}{0:'my number is: '0}", a); • Console.WriteLine ("{0}{0: 'my number is: '0}", b); • Console.WriteLine ("{0}{0: mine: 0}", a); • Console.WriteLine ("{0}{0:mine:0}", b); • } • }
5.2.2 格式化说明符 • 程序的执行结果: • "0"格式化说明符: • 12340001234 • 12.340000012 • "#"格式化说明符: • 123401234 • 12.3400012 • ","格式化说明符: • 10000001 • 20000002,000,000 • 33 • "%"格式化说明符: • 1234123400% • 12.341234% • 单引号格式化说明符: • 1234my number is: 1234 • 12.34my number is: 12 • 1234mine:1234 • 12.34mine:12
5.2.2 格式化说明符 • 【例5.6】使用for循环创建一个负数,然后将其递增为0和正数。并且可以使用同一个WriteLine来显示它们。本例将给出3种不同的情况。 • using System; • class CustomFormat2 • { • public static void Main() • { • Console.WriteLine("\n第一种情况"); • for( int x=-100; x<=100; x+=100) • { • Console.WriteLine("{0:000; -00000; '0'}", x); • } • Console.WriteLine("\n第二种情况"); • for( int x=-100; x<=100; x+=100) • { • Console.WriteLine("{0:正数:0; 负数:-0; 零:0}", x); • } • Console.WriteLine("\n第三种情况"); • for( int x=-100; x<=100; x+=100) • { • Console.WriteLine("{0:father:-0; mother :0; brother:0 }", x); • } • } • }
5.2.2 格式化说明符 • 程序运行结果: • 第一种情况 • -00100 • 0 • 100 • 第二种情况 • 负数:-100 • 零:0 • 正数:100 • 第三种情况 • mother:100 • brother:0 • father:-100
5.2.2 格式化说明符 • 3. 格式化日期和时间 • 获取日期和时间C#和.NET框架提供了一个用于存储日期和时间的类System.DateTime,我们可通过DateTime类获取完整的日期和时间。 • DateTime类常用的3种使用格式: • DateTime(int year, int month, int day); • DateTime(int year, int month, int day, int hour, int minute, int second); • DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond); • 我们只要按要求给出所要表示的日期和时间的整数数值就可以构造出DateTime类的对象。 • 例如,建立一个对象表示2002年10月1日上午8点30分15秒,可以用以下语句实现: • DateTime mydate=new DateTime (2002,10,1,8,30,15); //生成一个DateTime类的 • 对象 • DateTime类包含许多很有用的属性和方法,用于表示当前日期和时间等信息,DateTime类的属性如表5.3所示。
5.2.2 格式化说明符 表5.3 DateTime类的属性
5.2.2 格式化说明符 续表
5.2.2 格式化说明符 • 以上属性都是静态属性,因此可以直接通过类名来取得它们的值,不需要通过对象来调用,例如: • DateTime.Now • DateTime.Today • 【例5.7】获取日期和时间。 • using System; • using System.Globalization; • class DateTime1 • { • public static void Main() • { • DateTime date=new DateTime(2002,10,1); //构造一个DateTime对象2002年10月1日 • Console.WriteLine(date); • Console.WriteLine(date.DayOfWeek); //对象的星期数 • Console.WriteLine(date. DayOfYear); //对象的日期在一年中的序号 • Console.WriteLine(date. TimeOfDay); //对象的时间 • Console.WriteLine(DateTime.Now); //调用DateTime的静态属性,获取程序运行的当前时间 • } • } • 运行结果: • 2002-10-1 00:00:00 //在创建DateTime对象时,由于没有指定时间数值,所以时间数 • 值为0 • Tuesday //星期二 • 274 //2002年的第274天 • 00:00:00 • 2003-4--1 21:53:12
5.2.2 格式化说明符 • 格式化日期和时间数据在日常生活中,我们表示时间和日期的形式有多种。例如2002年10月1日16:00是一种表达方式,而这一日期和时间也可表示为:10/1/2002 4:00PM,除了这两种形式外,还有多种表达方式。如何让程序在输出时能显示我们想要的日期和时间格式呢?在DateTime类中封装了Write()方法,可以用来进行日期时间的格式化操作。日期和时间数据的格式化说明符如表5.4所示。
5.2.2 格式化说明符 表5.4 日期和时间格式化说明符 注: 表5.4中,d表示日期;m表示月份;y表示年份;h表示小时;m表示分钟;s表示秒;GMT表示国际标准时间。
5.2.2 格式化说明符 • 【例5.8】日期时间格式。 • using System; • using System.Globalization; • class DateTime2 • { • public static void Main() • { • //使用Format方法 • DateTime mydate1=new DateTime (2001,10,1,16,0,0); //构建对象 • //使用Write()方法 • DateTime mydate2= mydate1; • Console.WriteLine("d:{0:d}", mydate2); • Console.WriteLine("D:{0:D}", mydate2); • Console.WriteLine("f:{0:f}", mydate2); • Console.WriteLine("F:{0:F}", mydate2); • Console.WriteLine("g:{0:g}", mydate2); • Console.WriteLine("G:{0:G}", mydate2); • Console.WriteLine("m:{0:m}", mydate2); • Console.WriteLine("M:{0:M}", mydate2); • Console.WriteLine("r:{0:r}", mydate2); • Console.WriteLine("R:{0:R}", mydate2); • Console.WriteLine("s:{0:s}", mydate2); • //Console.WriteLine("S:{0:S}", mydate2); //错误! • Console.WriteLine("u:{0:u}", mydate2); • Console.WriteLine("d:{0:y}", mydate2); • Console.WriteLine("Y:{0:Y}", mydate2); • } • } • 读者可以上机运行该程序,并将结果与表5.4的内容进行比较,以便深刻理解和领会日期时间数据的格式。
5.3 处理字符串的方法 • 5.3.1 String类的字符串方法 • 5.3.2 StringBuilder类的字符串方法 • 5.3.3 Parse( )方法 • 5.3.4 Convert类
5.3 处理字符串的方法 • 前面已介绍了关于格式化字符串的所有知识,由于字符串是一种特殊的数据类型,所以介绍有关方面深入的应用问题。
5.3.1 String类的字符串方法 • 字符串变量是由关键字string来定义的,而String是System命名空间中的一个类,所以对字符串进行操作可以调用String类的所有属性和方法。 • String类的方法调用格式为:String.方法名() • 表5.5列出了一些String类常用的处理字符串的方法。有关表中方法的参数和String类的其他方法可参见MSDN文档。
5.3.1 String类的字符串方法 表5.5 String类常用的字符串方法
5.3.2 StringBuilder类的字符串方法 • 当我们调用字符串方法进行字符串的修改时,实际上将创建一个新的字符串,而存储在字符串中的某个字符是不能修改的。 • 例如:以下代码运行后字符串中的字符不能被修改。 • using System; • class StringError • { • public static void Main() • { • string str="abcdefghijklmnop"; • //字符串虽是由字符数组组成,但不能将其中第6个字符改为X,! • str[5]='X'; //程序运行会出错 • Console.WriteLine(str); • } • } • 程序运行后原字符串没有被修改,并且系统不正常退出。在实际应用中,使用表5.5中列出的处理字符串的方法时,需要为处理后的新字符串另设一个空的存储空间(即创建一个新的字符串对象)。例如,在本例中需要先将前5个字符复制到另一个存储空间,然后输入第6个字符,最后将从第7个字符开始的字符串复制到后面。 • 如果确实需要修改字符串,则应该使用C#提供的StringBuilder类。命名空间System.Text中的StringBuilder类用于创建存储可修改字符串的对象。使用StringBuilder类创建的对象与用String类创建的字符串类似,差别在于后者创建的字符串不能被修改,当要修改或操纵字符串时,必须再另创建一个新的字符串对象。而StringBuilder类的对象包含的字符串信息可以被修改,该类的方法也可直接操纵字符串中存储的值。表5.6列出了StringBuilder类的方法和属性。
5.3.2 StringBuilder类的字符串方法 表5.6 StringBuilder类的方法和属性
5.3.2 StringBuilder类的字符串方法 • 有关表5.6中方法的参数和StringBuilder类的其他方法可参见MSDN文档。 • 【例5.9】使用StringBuilder类。 • using System; • using System.Text; //为了引用StringBuilder类 • class BuildName • { • public static void Main() • { • StringBuilder chgstr=new StringBuilder(); //创建名为chgstr的 • StringBuilder对象 • string buffer; //创建名为buffer的字符串用于取得用户输入的信息 • int marker=0; • Console.Write("请输入您的姓:"); //读取"姓" • buffer= Console.ReadLine(); • if (buffer!=null) • { • chgstr.Append(buffer); //将姓追加到StringBuilder类的对象chgstr中 • marker= chgstr.Length; //将姓的长度赋给变量marker,该变量被用来确定放 • 置"中名"的位置 • }
5.3.2 StringBuilder类的字符串方法 • Console.Write("请输入您的姓名的最后一个字:"); //读"名" • buffer= Console.ReadLine(); • if (buffer!=null) • { • chgstr.Append(" "); //加一个空格 • chgstr.Append(buffer); //将buffer中字符串追加到chgstr中 • } • Console.Write("请输入您的中名:"); //读"中名" • buffer= Console.ReadLine(); • if (buffer!=null) • { • chgstr.Insert(marker+1, buffer); //将中名插入chgstr对象的中间 • chgstr.Insert(marker+buffer.Length+1, " "); //在"中名"后插入空格 • } • Console.WriteLine("您的全名是:{0}", chgstr); //显示全名 • Console.WriteLine("您的全名长度:{0}", chgstr.Length); • //输出chgstr对象当前存储的值的长度 • } • } • 程序的输出结果: • 请输入您的姓:刘(回车) • 请输入您的姓名的最后一个字:南(回车) • 请输入您的中名:泳 • 您的全名是:刘 泳 南 • 您的全名长度:5
5.3.3 Parse( )方法 • 上节介绍的Format方法和ToString方法,都是用来将数字转换为相应格式的字符串输出。而与这些方法相对应的Parse()方法则可以将字符串转换为数值类型数据,且被转换的字串可以包含格式化数据,也可以是由数字字符组成的字串。 • 调用Parse()方法的常用格式:public static 数据类型.Parse(string s); • 【例5.10】数字和字串的相互转换。 • using System; • using System.Globalization; • class Eachother • { • public static void Main() • { • int a; • double d; • string str; • str=Console.ReadLine(); //控制台输入整数数字字串 • a=int.Parse(str); //将字串转换为整数 • Console.WriteLine(a+11111); • str=Console.ReadLine(); //控制台输入双精度数字字串 • d=double.Parse(str); //将字串转换为双精度数 • Console.WriteLine(d+0.11); • } • } • 程序运行结果: • 12345 (回车) • 23456 • 123.45 (回车) • 123.56
5.3.4 Convert类 • 在实际应用中,使用Read()和ReadLine()方法读取数据的关键,不仅仅是要取得信息,而是想将获得的信息转换为想要的格式。如对字符串中的文本进行过滤,得到一个不同的字符串,或将其转换为一种不同的数据类型。 • System命名空间中有一个用于将某个基本数据类型转换为另一个基本数据类型的Convert类。Convert类包含了大量的可将数据转换为不同的数据类型的静态方法,由于是静态方法,所以可直接使用以下语句格式调用: • Convert.方法名(原数据变量); • 其中: • “方法”名是要使用的转换方法。表5.7列出了Convert类转换数据类型的一些方法。 • “原数据变量”是想要转换为新类型的数据变量。
5.3.3 Parse( )方法 表5.7 Convert类转换数据类型的方法
5.3.3 Parse( )方法 • 使用Convert类的前提条件是用using语句引用命名空间System.Text。Convert类位于基类库中,所以可在其他编程语言中使用这个类。注意,Convert类的方法将数据转换为基数据类型,而不是C#数据类型,但我们知道每种C#数据类型都有相应的基类型。 • 有关方法的参数和Conver类的其他方法可参见MSDN文档。 • 【例5.11】使用Convert类的方法,将读取的字符串转换为一个整数。 • using System; • using System.Text; //为了使用Convert类 • class UseConvert • { • public static void Main() • { • string buff; • int age; • Console.Write("请输入您的年龄:"); • buff=Console.ReadLine(); • try //捕获异常 • { • age=Convert.ToInt32(buff); //将输入的年龄字串转换为32位整数 • if (age<21) • Console.WriteLine("你不到21岁。"); • else • Console.WriteLine("你是21岁或已超过21 岁。"); • Console.WriteLine("后年你的年龄是:{0}", age+2); • } • catch(ArgumentException) //异常处理 • { • Console.WriteLine("no value was entered…(equal to null)."); • }