输入输出
freopen ()函数:1.格式
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
2.参数说明
filename: 要打开的文件名
mode: 文件打开的模式,和fopen中的模式(r/w)相同
stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr)
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值)
功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。
可以使用printf和scanf来对文件进行操作
printf
格式 %[flags] [ width] [.prec] [l] type
- scanf
L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
W 整型常数 指定输入数据所占宽度
* 星号 空读一个数据
hh,ll同上h,l但仅对C99有效。
https://www.baidu.com/link?url=jbbPLJHr8ObwpljglznMr3HMfz7oNUYJ7Ty2vfeJDp0fNXBcNm-45IOB0OoqxTTGPNQlTV5ow1dKfetYfif_ua&wd=&eqid=a617757a0001e605000000035a9815c0
消除缓冲区
首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从“输入缓冲区”中得到的字符。输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符。每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除。
然而,这个输入缓冲区的设计,是把所有从键盘上输入的东西都放进去的,包括你每次按的回车符‘\n’,而getchar函数只读走了你在回车前输入的那个字符,而将回车符保留在了输入缓冲区中。于是,第二次调用getchar时,函数就从输入缓冲区中读出了’\n’。
要解决这个问题,有两种可行的途径。一是多加一个getchar(),过滤掉回车,但是这种方法有不足,就是如果你在调用第一个getchar时输入了多个字符,那么,加入一个getchar并不能把所有未读取的字符过滤。如果你的本意是重新从“键盘”读取的话,最好是加一个
fflush(stdin);
参数引用
2维数组引用:
a[][N]
* 方法1: 第一维的长度可以不指定 *
* 但必须指定第二维的长度 *
*a)[5]
*方法2: 指向一个有5个元素一维数组的指针 *
http://www.cnblogs.com/applebunny/archive/2012/09/09/2677307.html
排序
sort和qsort函数
sort:
头文件: algorithm
函数原型:
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
- 1
- 2
- 3
- 4
- 5
sort作为STL库的成员函数,肯定是本着库通用的目的,采用模板元编程实现,可对STL库提供的大部分(?不知道是不是所有,目前仅排序过vector,string(list有自己的sort))容器进行排序(我猜应该是只能针对连续地址的数据进行排序)。
参数值:要排序的起始迭代器位置,尾后迭代器位置,比较函数(可选)。默认是升序排列。
如果想要降序排列,可以:1,重载要排序的元素类型的<操作符
2,传递一个比较函数,如果第一个参数小于第二个该函数,返回true(升序)。
如果第一个参数大于第二个该函数,返回true(降序)。
比较函数的原型为:
bool cmp(const Type1 &a, const Type2 &b);
- 1
cmp 函数的返回值 | 描述 |
---|---|
true | elem1将被排在elem2前面 |
false | 对elem1与elem2的次序不做改变 |
qsort:
头文件: cstdlib
函数原型:
void qsort(void *base , int nelem ,int width , int (*fcmp)(const void *,const void *));
- 1
qsort作为C语言标准库函数,可对连续地址存储的变量进行排序,没有默认排序方式,必须传入比较函数,并且相对于sort的操作符重载的方式改变排序规则的策略来讲,qsort只能通过改变比较函数的方式进行排序,策略单一。
参数值:排序的起始地址,排序的元素长度,要排序元素在内存中的占位值(即sizeof),比较函数指针
比较函数的原型为:
int compare( (void *) & elem1, (void *) & elem2 );
- 1
compare 函数的返回值 | 描述 |
---|---|
“< 0” | elem1将被排在elem2前面 |
“0” | elem1 等于 elem2 |
“> 0” | elem1 将被排在elem2后面 |
**这里需要注意的是,不同于qsort的比较函数,fcmp返回的是一个int值类型,而不是单纯的true和false
如果比较函数写成**
int comp(const void*a, const void*b)
{
return *(int*)a>*(int*)b;//当a<b时就会返回false,也就是0,那么会被qsort认为二者相等,最终导致排序错误
/*正确写法*/
//return *(int*)a-*(int*)b;
}
时间日期转换设置
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
struct tm t,*a;
time_t t_of_day;
t.tm_year=2010-1900;
t.tm_mon=4;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=1200000;
t.tm_sec=0;
t.tm_isdst=0;
t_of_day=mktime(&t);
a=gmtime(&t_of_day);
printf("%d %d %d %d %d",a->tm_year, a->tm_mon, a->tm_mday, a->tm_hour,a->tm_min);
return 0;
}