TCPL(The C Programming Language)读书笔记 第七章 输入与输出

1、           标准输入/输出

最简单的输入机制是使用getchar函数从标准输入中(一般为键盘)一次读取一个字符:int getchar(void)  getchar函数在每次被调用时返回下一个输入字符。若遇到文件结尾,则返回EOF(值为-1)。

getchar 由宏实现:#define getchar() fgetc(stdin)getchar有一个int型的返回值当程序调用getchar时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

int putchar(int)用于输出数据。putchar(c)将字符c送至标准输出上,在默认情况下,标准输出为屏幕显示。如果没有发生错误,则putchar将返回同输出的字符;若干发生了错误,则返回EOF

2、           格式化输出——printf函数

    printf函数的格式字符串包含两种类型的对象:普通字符和转换说明。在输出时,普通字符将原样不动地复制到输出流中,而转换说明并不直接输出到输出流中,而是用于控制printf中参数的转换和打印,每个转换说明都由一个百分号字符开始,并以一个转换字符结束。在%和转换字符中间可能依次包含下列组成部分:

负号

用于指定被转换的参数按照左对齐的形式输出

用于指定最小字段宽度。转换后的参数将打印不小于最小字段宽度的字段。如果有必要,字段左边(若使用左对齐则为右边)多余的字符位置用空格填充以保证最小字段宽

小数点

用于将字段宽度和精度分开

有关于指定精度

字母hl

h表示将整数作为short类型打印,l表示将整数作为long类型打印

函数sprintf执行的转换和函数printf相同,但它将输出保存到一个字符串中:

int sprintf(char *string,char *format,arg1,arg2,...);

sprintf函数和printf函数一样,按照format格式格式化参数序列arg1arg2...,但它将输出的结果存放在string中,而不是输出到标准输出中。当然,string必须足够大以存放输出结果。

3、           变长参数表

编写变长参数表函数的关键在于如何处理一个甚至连名字都没有的参数表。标准头文件<stdarg.h>中包含一组宏定义,它们对如何遍历参数表进行了定义。

va_list类型用于声明一个变量,该变量将依次引用各参数。若我们将该变量称为ap,意思是“参数指针”。宏va_startap初始化为指向第一个无名参数的指针。在使用ap之前,该宏必须被调用一次。参数表必须至少包括一个有名参数va_start将最后一个有名参数作为起点

每次调用va_arg,该函数都将返回一个参数,并将ap指向下一个参数。va_arg使用一个类型名来决定返回的对象类型、指针移动的步长。最后,必须在函数返回之前调用va_end,以完成一些必要的清理工作

4、           格式化输入——scanf函数

函数sscanf用于将一个字符串(而不是标准输入)中读取字符序列:

int sscanf (char *string,char *format,arg1,arg2,...);

它按照格式参数format中规定的格式扫描字符串string,并把结果分别保存到arg1arg2...这些参数中。这些参数必须是指针。

scanf函数的输入字段定义为一个不包括空白符的字符串,其边界定义为到下一个空白符或达到指定的字段宽度。这表明scanf函数将越过行边界读取输入,因为换行符也是空白符。(空白符包括空格符、横/纵向制表符、换行符、回车符以及换页符)。

注意,scanfsscanf函数的所有参数都必须是指针。最常见的错误形式是:

scanf(%d,n); //wrong    scanf(%d,&n); //right

5、           文件访问

在读写一个文件时之前,必须通过库函数fopen打开该文件。

FILE *fopen(char *name,char *mode);

第二个参数是访问模式,也是一个字符串,用于指定文件的使用方式。允许模式包括:读(r)、写(w)及追加(a)

如果打开一个不存在的文件用于写或追加,该文件将被创建(如果可能的话)。当以写方式打开一个已存在的文件时,该文件原来的内容将被覆盖。但是,如果以追加方式打开一个文件,则该文件原来的内容将保留不变

启动一个C语言程序时,操作系统环境负责打开3个文件,并将这3个文件的指针提供给该程序。这3个文件分别是标准输入、标准输出和标准错误,相应的文件指针分别为stdinstdoutstderr。它们都是FILE*类型的对象,但它们是常量,而非变量。因此不能对它们赋值。在大多数环境中,stdin指向键盘,而stdoutstderr指向显示器。

文件指针不再需要时,就应该通过fclose将其释放

6、           错误处理——sdrerrexit

标准库函数exit,当该函数被调用时,它将终止调用程序的执行。

7、           其他函数

(1)      ungetc函数

int ungetc(int c,FILE *fp)

该函数将字符c写回到fp中。如果执行成功,则返回c,否则返回EOF。每个文件只能接收一个写回字符。

(2)      命令执行函数

函数system(char *s)执行包含在字符串s中的命令,然后继续执行当前程序。s的内容在很大程度上与所用的操作系统有关。在UNIX系统中,语句system(date)将执行程序date,它在标准输出上打印当天的日期和时间。

(3)      存储管理函数

函数malloccalloc用于动态分配存储块。

void *malloc(size_t n)当分配成功时,它返回一个指针,设指针指向n字节长度的未初始化的存储空间,否则返回NULL

void *calloc(size_t n,size_t size) 当分配成功时,它返回一个指针,设指针指向的空闲空间足以容纳由n个指定长度的对象组成的数组,否则返回NULL。该存储空间被初始化为0

free(p)函数释放p指向的存储空间,其中,p是此前通过调用malloccalloc函数得到的指针。存储空间的释放顺序没有什么限制,但是,如果释放一个不是通过调用malloccalloc函数得到的指针所指向的存储空间,将是一个很严重的错误。

使用已经释放的存储空间同样是错误的。

(4)      随机数发生器函数

函数rand()生成介于0RAND_MAX之间的伪随机整数序列。其中RAND_MAX是在头文件<stdlib.h>中定义的符号常量。下面是一种生成大于等于0但小于1的随机浮点数的方法:

#define frand() ((double)rand()/(RAND_MAX+1.0))

函数srand(unsigned)设置rand函数的种子数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值