一步一步跟着杨中科.net视频学c#基础(3)

接上篇:http://www.cnblogs.com/CarreyWu/archive/2011/02/20/base_of_Csharp_02.html

(特别声明下:代码全是本人用键盘一行一行敲出来的,可能一些表达方法和大家不太一样,见笑了)

23.字符串的处理:
    ● c#中单个字符用单引号包含就是char类型,eg:"a",单引号中方且只能放一个字符。
    ● 单个字符也可以表示为字符串,还可以有长度为0的字符串。
    ● 使用s.Length属性来获得字符串中的字符的个数。//在c语言中字符串长度要在C#基础上加1,因为要考虑'\0'。eg:"abc"C#中长度为3位,在C中长度为4位。
    ● string可以看作是char的只读数组。char c = s[1];
      eg:遍历输出string中的每个元素:
        static void Main(string[] args)
   {
          string[] abc = { "233", "adf", "sgdfg", "rer", "345" };
          EachString(abc);
          Console.ReadKey();  
   }
        static void EachString(string[] strs)
        {
            foreach (string str in strs)
            {
                Console.WriteLine("此为字符串数组中的元素:{0}", str);
            }
        }
    ● c#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。
    ● 如果要对char进行修改,那么就必须创建一个新的字符串,用s.ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数(暂时不用细研究)来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。
      eg:将字符串中的A替换为a:
        static void Main(string[] args)
        {
            string str = "BAnAnA";
            Console.WriteLine(ConvertStr(str));
            Console.ReadLine();
        }
     static string ConvertStr(string str)
      {
          char[] acs = str.ToCharArray();
          for(int i=0;i<acs.Length;i++)
          {
              if (acs[i]=='A')
              {
                 acs[i]='a';
              }
          }
       string chars = new string(acs);
          return chars ;
      }
  
    ● 谁说字符串不可变?string s = "abc";s="123",s这不是变了吗
    ● 要区分变量名和变量指向的值的区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不可变。
      eg:string s1="hello";
         string s10=s1;//s10指向s1指向的字符串,而不是s10指向s1,哪怕s1以后指向了其他内存,那么s10还是指向“hello”
  char[] chars=s1.ToCharArray();
  char[0]='a';
  s1=new string(chars);
  Console.WriteLine(s1);
  Console.WriteLine(s10);
  Console>ReadKey();
24.String类常用函数:
   ● ToLower():得到字符串的小写形式。
     eg:String s = "Hello" ;
        string s1 = s.ToLower();//ToLower方法是返回一个小写形式的返回值
 //s = s.ToLower(); //并不是改变了字符串的内容,而是生成了一个新的全部变为小写的字符串,然后用s指向这个新的字符串
 Console.WriteLine(s);
 Console.WriteLine(s1);
 Console.WriteLine(s1.ToUpper());
 Console.ReadKey();
   ● 注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,二十把修改后的字符串的值通过函数返回值的形式返回。s.ToLower()与s=s.ToLower()
   ● ToUpper():得到字符串的大写形式:
      Trim():去掉字符串两端的空白。//字符串中间的空白它不管
   ● s1.Equals(s2,StringComparison.OrdinalIgnoreCase),两个字符串进行比区分大小写的比较。//Ingore:忽略。Case:大小写
     eg:boll b = "abc".Equals("ABC",StringComparison.OrdinalIgnoreCase)
        Console.WriteLine(b); //结果为True
 //==是区分大小写的比较,Equals("ABC",StringComparison.OrdinalIgnoreCase)是忽略大小写的比较
   ● int i = "abc".CompareTo("123");//CompareTo()方法(较少用)对两个字符串进行比较,如果前者比后者大,则返回一个大于0的数,如果前者比后者小则返回一个小于0的数,如果相等则返回0;
25.字符串的分割:
   ● string[] Split(params char[] separator):将字符串按照指定的分隔符分割为字符串数组;
     eg: string s1 = "aaa,bbb,ccc,ddd.eee.fff.ggg|hhh|iii";
         string[] strs = s1.Split(',','.','|');
  foreach(string item in strs)
  {
     Console.WriteLine(item);
  }
  Console.ReadKey();
   ● string[] Split(char[] separator,StringSplitOptions options)将字符串按照指定的char分割符分割为字符串数组(options 取 RemoveEmptyEntries的时候移除结果中的空白字符串);
     eg:string s1 = "aa,bb,,cc,,12,34";
        string[]strs = s1.Split(new char[]{','},StringSplitOptions.RemoveEmptyEntries);
 foreach(string item in strs)
 {
    Console.WriteLine(item);
 }
 Console.ReadKey();
   ● string[] split(string[] separator,StringSplitOptions options)将字符串按照指定的string分隔符分割为字符串数组;
     eg:string s1 = "我是孔明我是韩非子我是孔老二";
        string[]strs = s1.Split(new string[]{"我是"},StringSplitOptions.RemoveEmptyEntries);
 foreach(string item in strs)
 {
    Console.WriteLine(item);
 }
 Console.ReadKey();
     eg1:从日期字符串(“2008-08-08”)中分析出年,月,日;
         static void Main(string[] args)
  {
        string s = "2008-08-08";
     Console.WriteLine("年份是:{0};月份是:{1};{2}日。",ConvertStr(s));
        Console.ReadKey();
  }
  static string[] ConvertStr(string str)
  {
     string[] strs = str.Split('-');
            return strs;
  }
     eg2:从一个记录了学生成绩的文本文档,每个学生成绩是一行,每行是用|分割的数据,用|分割的域分别是姓名,年龄,成绩,写程序取出成绩最高学生的姓名和成绩。
         参考:使用string[]lines=System.IO.File.ReadAllLines(@"c:\root.ini",Encoding.Default);从文本文件读取数据,返回值为string数组,每个元素是一行。
             string[] txtlinesstrs = System.IO.File.ReadAllLines(@"d:\123\123.txt", Encoding.Default);
             string[] strs = {};
             int sum = 0;
             foreach(string linesstr in txtlinesstrs )
                {
                    strs = linesstr.Split('|');
                    Console.WriteLine("各位同学的成绩分别是:{0}", strs[2]);
                    sum = sum + Convert.ToInt32(strs[2]);
                }
             Console.WriteLine("共{0}位同学;同学们的平均成绩是{1}。",txtlinesstrs.Length,sum / (txtlinesstrs.Length));
             Console.ReadKey();
26.字符串函数详解:
   ● 字符串替换:string Replace(string oldValue,string newValue)将字符串中的出现oldValue的地方替换为newValue.
     eg:名字替换
        string s = "李时珍同志是一个好同志,是一个好医生,向李时珍同志学习";
 s = s.Replace("李时珍","李素丽");
 Console.WriteLine(s);
 Console.ReadKey();
   ● 取子字符串:string Subtring(int startIndex),取从位置startIndex开始一直到最后的子字符串
   ● string Substring(int startindex,int length),取从位置startIndex开始长度为length的子字符串,如果子字符串的长度不足length则报错。
     eg:string s = "http://www.baidu.com";
        string yuming = s.Substring(7);//从指定序号开始一直到最后的子字符串
 string str = s.Substring(7,5);//SubString第二个参数指的是截取多长,而不是结束位置;如果length参数超过了长度就会报错
 Console.WriteLine(yuming);
 Console.WriteLine(str);
 Console.ReadKey();
   ● bool Contains(strng value):判断字符串中是否含有子串value
     eg: string s = "我们的社会真和谐啊";
         if(s.Contains("社会")||s.Contains("和谐"))
  {
     Console.WriteLine("含有敏感词汇,请文明用语!");
  }
  Console.ReadKey();
   ● bool StartsWith(string value):判断字符串是否以字串value开始
   ● bool EndsWith(string value):判断字符串是否以子串value结束
     eg:string s = "http://www.top191.com";
        if(s.StartsWith("http://")||s.StartsWith("https://"))
 {
    Console.WriteLine("是网址");
 }
 else
 {
    Console.WriteLine("不是网址");
 }
 //s.EndsWith();
 Console.ReadKey();
   ● int IndexOf(string value):取子串value第一次出现的位置
     eg: string str = "今天会下雨吗?";
         int i = str.IndexOf("下雨");//返回子字符串的第一个字符第一次出现的位置,如果不存在则返回-1
  Console.WriteLine(i);
  Console.ReadKey();
27.字符串的处理练习:
   ● eg1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。"abc"→"cba"
        static void Main(string[] args)
        {
            string str = "abc";
            ConvertStr(str);
        }
        static void ConvertStr(string str)
        {
            char[] chars = str.ToCharArray();
            string a = "";
            for (int i = chars.Length - 1; i >= 0; i--)
            {
                a = a + chars[i];
            }
            Console.WriteLine(a);
            Console.ReadKey();
        }
   ● eg2:接收用户输入的一句英文,将其中的单词以反序输出。"hello c sharp"→"sharp c hello"
        static void Main(string[] args)
        {
            string str = "hello c sharp";
            ConvertStr(str);
        }
        static void ConvertStr(string str)
        {
            string[] strs = str.Split(' ');
            string str2 = "";
            for (int i = strs.Length-1; i >= 0; i--)
            {
                str2 = str2 + strs[i]+" ";
            }
            Console.WriteLine(str2);
            Console.ReadKey();
        }
   ● eg3:从Email中提取出用户名和域名:abc@163.com
         static void Main(string[] args)
    {
          
          Console.WriteLine("请输入一个合法的Email账户:");
       string str = Console.ReadLine();
       EmailSelect(str);
    }
         static void EmailSelect(string str)
    {

           if (str.Contains("@")&&str.Contains("."))
           {
               int i = str.IndexOf("@");
               Console.WriteLine("用户名:{0}", str.Substring(0, i));
               Console.WriteLine("域名:{0}", str.Substring(i + 1));
               Console.ReadKey();
               return;
           }
           else
           {
               Console.WriteLine("很抱歉,您输入的并非Email邮箱");
               Console.ReadKey();              
           }
    }
   ● eg4:文本文件中存储了多个文章标题,作者,标题和作者之间用若干空格隔开,每行一个,标题有的长有的短,输出的控制台的时候最多标题长度20,如果超过20,则截取长度17的字符串并且最后添加"...",加一个竖线后输出作者的名字
        (1)-标准答案:
    static void Main(string[] args)
      {
         string[] lines =System.IO.File.ReadAllLines(@"d:\123\456.txt",Encoding.Default);
  foreach(string line in lines)
   {
            //string[] strs = line.Split('');
            string[] strs = line.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries);
     string title = strs[0];//标题
     string author = strs[1];//作者
     //title.Substring(0,17);
           if (title.Length > 17)
           {
               title = title.Substring(0, Math.Min(17, title.Length));//17和标题的长度两个数的最小值。Math.Min()用来计算两个数中的最小值
               title = title + "...";//一个问题:当标题没有超长的时候还会出现“。。。”
           }
                Console.WriteLine("{0}|{1}",title,author);
   }
                Console.ReadKey();
      }
 (2)static void Main(string[] args)
    {
      
       TxtConvert();
    }
  static void TxtConvert()
    {
          string[] txtlines = System.IO.File.ReadAllLines(@"d:\123\456.txt", Encoding.Default);
       string[] strs = {};
       foreach(string a in txtlines)
         {
                strs = a.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                strs[0] = strs[0].Trim();
                strs[1] = strs[1].Trim();
                if (strs[0].Length > 20)
                {
                    strs[0] = strs[0].Substring(0, 17) + strs[0].Replace(strs[0].Substring(18), "...");
                    Console.WriteLine("输出结果为:{0}", strs[0] + "|" + strs[1]);
                }
                else
                {
                    Console.WriteLine("输出结果为:{0}", strs[0] + "|" + strs[1]);
                }
      }
          Console.ReadKey();
    }
   ● eg5:从ini格式的文件中(每行是“件=值”格式)中读取出配置项的值
         static void Main(string[] args)
    {
       string value = GetConfigValue(@"d:\123\345.txt","端口");
       Console.WriteLine(value);
       Console.ReadLine();
    }
  static string GetConfigValue(string filename,string itemName)
    {
       string[] lines = System.IO.File.ReadAllLines(filename,Encoding.Default);
       foreach(string line in lines)
         {
     string[] strs = line.Split('=');
     string name = strs[0];
     string value = strs[1];
     if(name.Trim()==itemName)
       {
         return value.Trim();
       }
  }
  return"您输入的参数错误";//如果不加,那么程序就存在没有返回值的情况。且不能写在if语句后面。后面可以用异常的方法来解决。
    }
   ● eg6:自己动手写聊天机器人,能够回答不同城市的天气,回答感情问题,问的次数过多还会饿死,提问可以模糊提问(包含指定关键词)
        static void Main(string[] args)
        {
            Console.WriteLine("你好!我是机器人!");
            while (true)
            {
                string str = Console.ReadLine();
                if (str.Contains("天气"))
                {
                    string city = str.Substring(2);
                    Console.WriteLine("{0}的天气是晴朗", city);
                }
                else if (str.Contains("你") && (str.Contains("名字") || str.Contains("姓名")))
                {
                    Console.WriteLine("不要崇拜哥,哥只是个传说");
                }
                else if (str.StartsWith("88") || str.StartsWith("再见") || str.StartsWith("bye"))
                {
                    Console.WriteLine("萨又拿啦!");
                    return;
                }
                Console.ReadKey();
            }

        }
28.函数的ref,out参数
   函数的参数默认是值传递的,也就是"复制一份“
        eg:static void Main(string[] args)
      {
         int age = 20;
         IncAge(age);
         Console.WriteLine(”age={0}",age);//打印出的结果为:20
              }
     static void IncAge(int age)//复制了一份,IncAge内部改变的是副本
       {
          age++
       }


     //ref:
            static void Main(string[] args)
      {
         int age = 20;
         IncAge(ref age);
         Console.WriteLine(”age={0}",age);//打印出的结果为:21
              }
     static void IncAge(ref int age)
       {
          age++
       }


     //out:
            static void Main(string[] args)
      {
         int age = 20;
         IncAge(out age);
         Console.WriteLine(”age={0}",age);//打印出的结果为:21
              }
     static void IncAge(out int age)
       {
          Console.WtriteLine(age);//提示没有初始化,外面给了初值,里面都将认为没有初始化
          age=30;//out参数必须赋值。对于out来讲不需要在外面赋初值
       }
   ref必须先初始化,因为是引用,所以必须先"有“,才能引用,而out则是内部为外部复制,所以不需要初始化,而且初始化也没用。
   ref应用场景内部对外部的值进行改变,out则是内部为外部变量复制,out一般用在函数有多个返回值的场所。
   案例:两个变量交换;int.TryParse.
            string str = Console.ReadLine();
            int i;
            if (int.TryParse(str, out i))
            {
                Console.WriteLine("转换成功!{0}", i);
            }
            else
            {
                Console.WriteLine("转换失败");
            }
            Console.ReadKey();
   两个变量交换:ref应用
        static void Main(string[] args)
        {

            int i1 = 10;
            int i2 = 20;
            Swap(ref i1, ref i2);
            Console.WriteLine("i1={0},i2={1}", i1, i2);
            Console.ReadKey();
        }
        static void Swap(ref int i1, ref int i2)
        {
            int temp = i1;
            i1 = i2;
            i2 = temp;
        }

posted on 2011-03-11 02:41  CarreyWu  阅读(5272)  评论(14编辑  收藏  举报

导航