PAT学习笔记(1)

来源:互联网 发布:it行业发展方向 编辑:程序博客网 时间:2024/06/05 19:02

本周碰到的问题主要是在输入函数scanf_s和cin以及之前在algorithm算法库里面的sort函数用法还是有些用的。
1、Scanf_s函数读入网上是说scanf()在读取时不检查边界,所以可能会造成内存访问越界。
比如说char buf[5]={‘\0’};
scanf(“%s”, buf);
如果输入1234567890,后面的部分会被写到别的空间上去,造成内存泄漏。
该函数正确的写法是在后面加一个参数,表示缓冲区的大小。
比如说char d[20];写成scanf_s(“%s”,d,20);才是正确的,有这个参数20使准确性提高。
把程序改成这样也可以。
1. char c1, c2;
2. scanf_s(“%c%c”, &c1, sizeof(c1), &c2, sizeof(c2));
后者写的感觉会更好一些。

该函数如果是用来输入int型变量可以不加缓冲区大小也可以。
2、cin
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
空格和回车和tab键都是结束条件,但是有一些题目如题B1033输入为空,这样就不能够用cin。于是我们可以用getline函数
getline(istream &in, string &s)
从输入流读入一行到string s
getline(cin, missing_word);用这么一句话就可以即使输入为空也可以,进行missing_word的输入。
3、sort函数
Sort函数是我用的很多函数中的一个,其函数参数可以是容器的迭代器,也可以是数值的指针。第三个参数是比较函数。因为引入了比较函数,这个sort函数的灵活性大大的提高了。比较函数可以定义一个更加灵活和复杂的比较规则。
比如说B1013里面的德才论,他的排序规则为:每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
因此可以这样写比较函数
bool comparer(StuStruct &stu_a, StuStruct &stu_b)
{
if (stu_a.sum != stu_b.sum)
{
return (stu_a.sum > stu_b.sum);
}
else
{
if (stu_a.virtue != stu_b.virtue)
return (stu_a.virtue > stu_b.virtue);
else
return (stu_a.id < stu_b.id);
}
}

sort(NO1Stu.begin(), NO1Stu.end(), comparer);这样通过这样一句话就可以完成复杂的排序。非常好用。

原创粉丝点击