复试C语言

输入输出

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指定的文件中。标准流文件具体是指stdinstdoutstderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。

可以使用printf和scanf来对文件进行操作



  • printf

格式   %[flags] [ width] [.prec] [l] type 

* 通过参数(只有域宽)来输入所需的数据域宽*  
int width = 10; 
printf(“%* d”, width, result); /* 以10个字符长的宽度输出result */ 
printf(“:%* .* d:\n”, 10, 6, 100); /* 即域宽为10,6位数,右对齐 */ 
结果为 : 000100: 前面有四个空格

printf的格式控制的完整格式: 
% - 0 m.n l或h 格式字符 
下面对组成格式说明的各项加以说明: 
①%:表示格式说明的起始符号,不可缺少。 
②-:有-表示左对齐输出,如省略表示右对齐输出。 
③0: 有0表示指定空位填0,如省略表示指定空位不填。 
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。*对于字符串.n表示用于指定从字符串左侧开始截取的子串字符个数。 
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。

  • 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 函数的返回值描述
trueelem1将被排在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值