C#基础回顾3

● 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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值