using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
* 字符串的处理
*/
namespace _42字符串基础
{
class Program
{
static void Main(string[] args)
{
//C#中的单个字符用单引号包含就是char类型,('a'),单引号中放且只能放一个字符
//char a = 'a';
//char b = 'aaa'; 错
//单个字符也可以表示为字符中,还可以有长度为0的字符串通一气
//string a = "a";
//string b = "";
//string 可以看做是char的只读数组,char c= s[1]. 例子: 历输出string中的每个元素
/*string s1 = "afsafsfasfaf";
//c//har[] b = a.ToCharArray();
for (int i = 0; i < s1.Length; i++)
{
char c1 = s1[i];
Console.WriteLine("第{0}个字符为:{1}",i,c1);
}*/
//C#中字符串有一个重要的特性,<<不可变性>>,字符串一旦声明就不再可以改变,所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改
/*string s1 = "Hello";
string s2 = s1; //s2直向s1所在的内存空间
//s1[0] = "h"; //这样操作是不行的
char[] chars = s1.ToCharArray();
chars[0] = 'h';
//请记住,这里并不是修改了s1的值,而是让s1重新指向了一个内存空间,而这块内存空间写的是hello
s1 = new string(chars);
Console.WriteLine("s1的值为:{0}",s1);
Console.WriteLine("s2的值为:{0}",s2);
//常风疑问:
//谁说字符串不可变?string s="abc", s="123"; s这不是变了吗
string s ="abc";
s = "123"; //这里并没改abc这块内存空间,而是让s重新指向了一块内存空间
*/
//要区分变量名和变量指向的值的区别,程序中可以有很多字符串,然后由字符串变量指向它们,变量可以指向其他的字符串,但是不定字符串本身没有变化,字符串不可变性指的是内存中的字符串不可变,而不是变量不变
//string类常用函数
//ToLower(); 得到字符串的小写形式
/*string s = "HELLO";
string s1 = s.ToLower();
Console.WriteLine(s1);
string s2 = s.ToUpper();
Console.WriteLine(s2);
//注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回
//s.ToLower()与 s = s.ToLower()
//ToUpper();得到字符串的大写形式
//Trim()去掉字符串两端的空白
string s3 = " Hello ";
Console.WriteLine(s3);
string s4 = s3.Trim();
Console.WriteLine(s4);*/
//s1.Equals(s2,StringComparison.OrdinallgnoreCase),两个字符串进行区分大小写的比较
/*bool b = ("abc"=="ABC");
Console.WriteLine(b);
//Ignore忽略, case:大小写
//==是区分大小写的比较,Equals("ABC",StringComparison.OrdinalIgnoreCase)是忽略大小写的比较
bool bb = "abc".Equals("ABC",StringComparison.OrdinalIgnoreCase);
Console.WriteLine(bb);
//两个字符进行比较
//如果相等返回0,如果abc大于123返回比0大的值,如果123大于abc返回负值
int i = "abc".CompareTo("123");*/
//字符串的分割
//string[] Split(params char[] separator); 将字符串按照指定的分割符分割为字符串数组
/*string names = "aa,bb,cc,dd,ee,ff";
string[] namei = names.Split(',');
foreach (string name in namei) {
Console.WriteLine("我的名字是:{0}",name);
}*/
//string[] Split(char[] separator, StringSplitOptions options)将字符串按照指定的char分割符分割除为字符串数组(opations取RemoveEmptyEntries的时候移除结果中的宽白字符串)
/*string names = "aa,bb,cc,dd,ee|ff,*ff";
string[] namei = names.Split(',','|','*');
foreach (string name in namei)
{
Console.WriteLine("我的名字是:{0}", name);
}*/
/*string names = "aa,bb,cc,dd,ee,ff,,ss,,,ff";
//第一个参数必须是一个char组数
//string[] namei = names.Split(',', StringSplitOptions.RemoveEmptyEntries());
//去掉空的数据
string[] namei = names.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string name in namei) {
Console.WriteLine("我的名字是:{0}", name);
}*/
//string[] Split(string[] separator, StringSplitOptions options)将字符串按照指定的string分割为字符串数组
/*string s = "我是刘邦我是关丽我是张飞";
string[] ss = s.Split(new string[]{"我是"}, StringSplitOptions.RemoveEmptyEntries);
foreach (string _ss in ss) {
Console.WriteLine("也也:{0}",_ss);
}*/
//例子1: 从日期字符串("2008-08-08")中分析出年月日;
//string date = "2008-08-08";
//string[] _date = date.Split('-');
//Console.WriteLine("{0}年{1}月{2}日",_date[0],_date[1],_date[2]);
//例子2: 从一个记录了学生成绩的文本文档,每个学生成绩是一行,每行是用|分割的数据,用|分害的域分别是姓名,年龄成绩
//写程序取出成绩最高学生的姓名和成绩
/*string[] lines = System.IO.File.ReadAllLines(@"D:\roo.ini", Encoding.Default);
int sum = 0;
string name="";
foreach (string line in lines) {
//Console.WriteLine(line);
string[] a = line.Split('|');
int _sum = Convert.ToInt32(a[2]);
if (_sum > sum) {
sum = _sum;
name = a[0];
}
}
Console.WriteLine("取高分为:{0}",sum);
Console.WriteLine("名称为:{0}",name);*/
//字符串函数详解
//字符串替换: stirng Replace(stirng oldValue, stirng newValue)将字符串中的出现oldValue的地方替换为newValue,
/*string names = "我是张飞";
string na = names.Replace("张飞","向铃川");
Console.WriteLine(na);
//取子字符串: string Substring(int startIndex),取从位置startIndex开始一直到最后的字符串
string name2 = names.Substring(2);
Console.WriteLine(name2);
//string Substring(int startIndex, int lenght)取从位置startIndex开始长度为length的子字符串,如果字符串的长度不足Lenght则报错
string title = "我家北京天安门,天安门上红旗飞";
string _title = title.Substring(3,title.Length-3);
Console.WriteLine(_title);
//bool Contains(string value)判断字符串中是否含有子串value
bool ii = title.Contains("天安门");
Console.WriteLine(ii);
//bool StartsWidth(String value)判断字符串是否以子串value开始
bool tt = title.StartsWith("我家");
Console.WriteLine(tt);
//bool EndsWith(string value)判断字符串是否以子串value结束
bool tt1 = title.EndsWith("aaa");
Console.WriteLine(tt1);
//int IndexOf(string value); 取子串value第一次出现的位置
int index = title.IndexOf("天");
Console.WriteLine(index);*/
//字符串的处理练习
//接收用户输往返字符串,将其中的字符以与输入相反的顺序输出
/*Console.WriteLine("请输入字符串:");
string str = "";
str = Console.ReadLine();
for (int i = 0; i<str.Length; i++) {
Console.WriteLine(str[i]);
}
for (int j = str.Length-1; j >= 0; j--) {
Console.WriteLine("j等于:{0},值为:{1}",j,str[j]);
}*/
//接收用户输入的一句项文,将其中的单词以反序输出
/*Console.WriteLine("请输入一句英文:");
string str = Console.ReadLine();
string[] _str = str.Split(' ');
Console.WriteLine("输入的字符为:{0}",str);
Console.WriteLine("转换后:");
for (int i = _str.Length - 1; i >= 0; i--) {
Console.WriteLine(_str[i]);
}*/
//从Email中提取出用户名和域名
/*string email = "xlc@163.com";
int i = email.IndexOf('@');
string start = email.Substring(0,i);
string end = email.Substring(i+1);
Console.WriteLine("用户名为:{0},域名为:{1}",start,end);*/
//读取文章标题和内容
string[] lines = System.IO.File.ReadAllLines(@"d:\1.txt", Encoding.Default);
foreach (string str in lines) {
//Console.WriteLine(str);
string[] vstr = str.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
string title = vstr[0];
string author = vstr[1];
if (title.Length >= 17) {
title = title.Substring(0, 17);
title += "......";
}
Console.WriteLine("标题:{0} | 作者:{1}",title,author);
}
Console.ReadKey();
}
}
}