C程序设计语言学习第七章 输入与输出

第七章 输入与输出

格式化输出printf函数

  • 转换说明

    • 每个转换说明都由一个百分号%开始以一个转换字符结束在%和转换字符之间包含下列组成部分

      ●负号,用于指定被转换的参数按照左对齐的形式输出。
      ●数,用于指定最小字段宽度。转换后的参数将打印不小于最小字段宽度的字段。如果有必要,字段左边(如果使用左对齐的方式,则为右边)多余的字符位置用空格填充以保证最小字段宽。
      ●小数点,用于将字段宽度和精度分开。
      ●数,用于指定精度,即指定字符串中要打印的最大字符数、浮点数小数点后的位数、整型最少输出的数字数目。
      ●字母h或1,字母h表不将整数作为short类型打印,字母1表示将整数作为long类型打印。

    • 在转换说明中,宽度或精度可以用星号*表示,这时,宽度或精度的值通过转换下一参数(必须为int类型)来计算:
      printf("%.*s",max,s);
      例如上式最多可以打印max个字符

    • 注意

      • printf(s); /* FAILS if s contains % /
        printf("%s", s); /
        SAFE */
        第一句s如果包含%则会失败,第二句不会

格式化输入函数:scanf

  • 函数的参数都必须是指针(这样才能保证scanf赋值给参数的结果外部能正常访问到)
  • 格式串通常都包含转换说明,用于控制输入的转换。格式串可能包含下列部分:
    ●空格或制表符,在处理过程中将被忽略。
    ●普通字符(不包括字符’%’),用于匹配输入流中下一个非空白符字符。
    ●转换说明,依次由一个%、一个可选的赋值禁止字符*、-一个可选的数值(指定最大字段宽度)、一个可选的h、l或L字符(指定目标对象的宽度)以及一个转换字符组成。
  • 转换说明控制下一个输入字段的转换。-般来说,转换结果存放在相应的参数指向的变量中。但是,如果转换说明中有赋值禁止字符*,则跳过该输入字段不进行赋值。输入字段定义为一个不包括空白符的字符串,其边界定义为到下一个空白符或达到指定的字段宽度。这表明scanf 函数将越过行边界读取输入,因为换行符也是空白符。(空白符包括空格符、
    横向制表符、换行符、回车符、纵向制表符以及换页符)。
  • 转换说明d、i、o、u及x的前面可以加上字符h或l。前缀h表明参数表的相应参数是一个指向short类型而非int类型的指针,前缀l表明参数表的相应参数是一个指向long类型的指针。类似地,转换说明e、f和g的前面也可以加上前缀l,它表明参数表的相应参数是一个指向double类型而非float类型的指针。

(注意两种加l的意义不同, d i o u x都是整数,前面加l表示长整型,e f g 都是浮点数,前面加l 表示double类型(类似于 long int 和int的区别, long 浮点型代表double))

  • 注意

    • scanf和sscanf函数的所有参数都必须是指针,如果不写成指针,编译器一般也检测不出来
    • %s使用时,参数可以不加取地址符&,因为%s代表字符串,字符串是一个数组,数组名本身就是一个指针,所以不用使用取地址符
    • scanf函数忽略格式串中的空格和制表符。此外,在读取输入值时,它将跳过空白符(空格、制表符、换行符等等)。如果要读取格式不固定的输入,最好每次读入一行,然后再用sscanf将合适的格式分离出来读入。
    • scanf函数可以和其它输入函数混合使用。无论调用哪个输入函数,下一 一个输入函数的调用将从scanf没有读取的第一个字符处开始读取数据。

文件访问

  • 文件指针

    • 文件指针指向一个包含文件信息的结构,这些信息包括:缓冲区的位置、缓冲区中当前字符的位置、文件的读或写状态、是否出错或是否已经到达文件结尾等等。用户不必关心这些细节,因为<stdio. h>中已经定义了一-个包含这些信息的结构FILE. 在程序中只需按照下列方式声明一-个文件指针即可:
      FILE *fp;
      FILE *fopen(char *name, char *mode);
      //name 文件名 mode 访问模式

允许的模式包括:读( “r”)、写( “w”)及追加( “a”).某些
系统还区分文本文件和二进制文件,对后者的访问需要在模式字符串中增加字符" b"
- 文件指针stdin、stdout都是FILE*类型的对象,它们是常量而非变量,所以不能赋值

  • fopen

    • FILE *fopen(char *name, char *mode);
      fp = fopen(name, mode);
    • fopen打开一个文件(建立通信),并返回一个可以用于文件读写操作的指针
  • getc\putc

    • 将字符c写入到fp指向的文件,并返回写入的字符,如果发生错误则返回EOF
    • getc和putc是宏而不是函数
  • 文件的格式化输入或输出

    • fscanf/fprintf

      • 和scanf的区别仅仅在于第一个参数是一个文件指针,第二个参数是一个格式串

错误处理stderr、exit

  • stderr

    • stderr和stdin和stdout相同的方式分派给程序,但是即使对标准输出进行了重定向,写到stderr中的输出通常也会显示在屏幕上
  • exit

    • exit终止程序的运行,同时返回给调用者参数的值
    • return expr 等价于exit(expr),但是使用exit可以返回给调用者参数值

行输入和行输出

  • char *fgets(char *line, int maxline, FILE *fp)

    • fgets函数从fp指向的文件中读取下一个输入行(包括换行符),并将它存放在字符数组line中,它最多可读取maxline-1个字符。读取的行将以’\0’结尾保存到数组中。通常情况下,fgets返回line,但如果遇到了文件结尾或发生了错误,则返回NULL
  • int fputs(char *line, FILE *fp)

    • 正常执行返回一个非负值,发生错误返回EOF
  • 库函数gets和puts的功能与fgets和fputs函数类似,但它们是对stdin和s tdout进行操作。有一点我们需要注意,gets 函数在读取字符串时将删除结尾的换行符( ‘\n’),而puts函数在写入字符串时将在结尾添加一个换行符。

  • ANSI标准规定,ferror 在发生错误时返回非0值,而fputs在发生错误时返回EOF,其它情况返回一个非负值。

其他函数

  • 字符串操作函数

  • 字符类别测试和转换函数

  • ungetc函数

    • int ungetc(int c, FILE *fp)
    • 该函数将字符c写回到文件fp中。如果执行成功,则返回c,否则返回EOF.每个文件只能接收一个写回字符。ungetc函数可以和任何一个输入函数一起使用,比如scanf、getc或getchar.
  • 命令执行函数

    • system(“date”);
    • 执行程序date,它在标准输出上打印当天的日期和时间。system 函数返回一个整型的状态值,其值来自于执行的命令,并同具体系统有关。在UNIX系统中,返回的状态是exit的返回值。
  • 存储管理函数

    • malloc

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

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

      • free §函数释放p指向的存储空间,其中,p是此前通过调用malloc或calloc函数得到的指针.存储空间的释放顺序没有什么限制,但是,如果释放一个不是通过调用malloc或calloc函数得到的指针所指向的存储空间,将是一个很严重的错误。
    • 注意:使用已经释放的存储空间同样是错误的

      • for (p = head; p != NULL; p = p->next) /* WRONG */
        free§;
        正确写法:
        for (p = head; p != NULL; p = q) {
        q = p->next;
        free§;
        }
  • 数学函数

  • 随机数发生器函数

    • 生成大于等于0但小于1的随机浮点数:
      #define frand() ((double) rand() / (RANDMAX+1.0))
    • 函数rand ()生成介于0和RAND MAX之间的伪随机整数序列。其中RAND MAX是在头文件<stdlib.h>中定义的符号常量。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值