Linux格式化输入输出函数操作

  • A+
所属分类:Linux编程
摘要

有许多的库函数可以按我们所希望的方式产生输出,而如果我们有过一些C语言编程的经验,我们就会对于这些格式感到熟悉.这些函数包括

有许多的库函数可以按我们所希望的方式产生输出,而如果我们有过一些C语言编程的经验,我们就会对于这些格式感到熟悉.这些函数包括prinf以及其他的一些向文件流中写入数据的函数以及scanf和其他的一些函数从文件流中读取数据的函数.

参数format字符串可包含下列三种字符类型:
1. 一般文本伴随直接输出.
2. ASCII控制字符\t, \n.
3. 格式转换字符.
    格式转换为一个百分比符号(%)及其后的格式字符所组成一般而言每个%符号在其后都必需有一printf()的参数与之相呼应(只有当%%转换字符出现时会直接输出%字符), 而欲输出的数据类型必须与其相对应的转换字符类型相同.
printf()格式转换的一般形式如下:
%[flags][width][.prec]type
以中括号括起来的参数为选择性参数%type则是必要的底下先介绍type的几种形式:
整数:
%d 整数的参数会被转成一有符号的十进制数字
%u 整数的参数会被转成一无符号的十进制数字
%o 整数的参数会被转成一无符号的八进制数字
%x 整数的参数会被转成一无符号的十六进制数字并以小写abcdef表示
%X 整数的参数会被转成一无符号的十六进制数字并以大写ABCDEF表示
浮点型数:
%f double型的参数会被转成十进制数字并取到小数点以下六位四舍五入.
%e double型的参数以指数形式打印有一个数字会在小数点前六位数字在小数点后而在指数部分会以小写的e来表示.
%E %e作用相同唯一区别是指数部分将以大写的E来表示.
%g double型的参数会自动选择以%f%e的格式来打印其标准是根据欲打印的数值及所设置的有效位数来决定.
%G %g作用相同唯一区别在以指数形态打印时会选择%E格式.
字符及字符串:
%c 整型数的参数会被转成unsigned char型打印出.
%s 指向字符串的参数会被逐字输出直到出现NULL字符为止.
%p 如果是参数是"void *"型指针则使用十六进制格式显示.
prec有几种情况:
1. 正整数的最小位数.
2. 在浮点型数中代表小数位数
3. %g格式代表有效位数的最大值.
4. %s格式代表字符串的最大长度.
5. 若为×符号则代表下个参数值为最大长度.
width为参数的最小长度若此栏并非数值而是*符号则表示以下一个参数当做参数长度.
flags有下列几种情况:
此旗标会将一数值向左对齐.
一般在打印负数时, printf()会加印一个负号整数则不加任何负号此旗标会使得在打印正数前多一个正号(+).
此旗标会根据其后转换字符的不同而有不同含义当在类型为o之前(%#o), 则会在打印八进制数值前多印一个o.而在类型为x之前(%#o)则会在打印十六进制数前多印’0x’, 在型态为eEfgG之前则会强迫数值打印小数点在类型为gG之前时则同时保留小数点及小数位数末尾的零.
当有指定参数时无数字的参数将补上0. 默认是关闭此旗标所以一般会打印出空白字符.


printf,fprintf,sprintf
printf函数家族可以格式化并输出不同类型的变量参数.在输出流中所代表的每一个函数的工作方式是由format参数来控制的,这个参数包含要打印的普通的字符串和代码,也就是称之为转义字符的部分,这些用来表明要如何和在哪里打印其余的参数.
其语法格式如下:
#include <stdio.h>
int printf(const char *format, ...);
int sprintf(char *s, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
printf 函数在标准输出上产生他的输出.fprintf函数在一个指定的流上产生他的输出,sprintf函数会将他的输出与一个结束空字符写入字符串s,是作为参数来进行传递的.这个字符必须足够的大来包含所有的输出.另外还有一些printf函数家族中其他的函数可以用来以不同的方式来处理不同的参数我们可以通过查看printf手册页得到更为详细的内容.
普通的字符在传递到输出后并不会发生改变.转义字符会使得printf取回并格式化传递的其余参数.他们能通常是以%字符开头的.如下面的一些例子:
printf(“Some numbers: %d, %d, and %d\n”, 1, 2, 3);
他在标准输出的结果如下:
Some numbers: 1, 2, and 3
如果我们要打印一个%字符,我们必须使用%%,这样就不会与一个转义字符发生混淆了.
下面是一些最常的转义字符:
%d,%i:以十进制数打印一个整数
%o,%x:以八进制,十六进制数打印
%c:打印一个字符
%s:打印一个字符串
%f:打印一个浮点数(单精度数)
%e:以定点数的格式打印一个双精度数
%g:以普通格式打印一个双精度数
format 字符串传递给printf函数与转义字符相匹配的参数类型和个数是非常重要的.一个可选的尺寸标识可以用来表明整数参数的类型.这个可以是h,例如,% hd用来表明short int,或是可以是l,例如,%ld用来表明long int.一些编译器可以检查printf的这些参数,但是他们并不是绝对可靠的.如果我们正在使用GNU编译器gcc,我们可以使用-Wformat来做 到这一点.
如下面的例子:
char initial = ‘A’;
char *surname = “Matthew”;
double age = 14.5;
printf(“Hello Miss %c %s, aged %g\n”, initial, surname, age);
这个例子的结果如下:
Hello Miss A Matthew, aged 14.5
如果我们使用域标识,我们就可以更多的控制打印的方式.这些扩展了转义字符从而可以控制输出中的空格.一个常用的用法是可以用来为浮点数的打印指定一个十进制数的空间或是为一个字符串指定一个打印的空间.
域标识是在转义字符的%字符后面以数字的方式来指定的.下面的这个表中包含了一些转义字符的例子以及他们的输出结果.
Format Argument       |     Output     |
%10s   “Hello”        |            Hello|
%-10s  “Hello”        |Hello             |
%10d   1234            |             1234|
%-10d  1234              |1234              |
%010d  1234            |0000001234        |
%10.4f 12.34           |         12.3400|
%*s    10,”Hello”      |            Hello|
所 有的这些例子以10个字符的宽度进行打印.在这里我们要注意就是在域宽度中负数用来表明打印的内容要左对齐.一个变化的区域宽度可以用一个通配符*来指 定.在这样的情况下,下一个参数用来指定宽度.开头的0用来要打印的内容以0开头的.根据POSIX的说明,printf函数并不会截断一个要打印的域而是进行扩展来进行填充.所以,如果我们要打印一个比我们所指定的域长的内容,那么这个域会进行增长.
如下面的表格所示:
Format Argument              |     Output   |
%10s   “HelloTherePeeps”    |HelloTherePeeps|
printf会返回一个整数,用来表明写入的字符个数.这在sprintf函数中并不包括结束字符null.如果出现错误,则会返回一个负数并且会设置errno.
scanf,fscanf,sscanf
scanf函数家族的工作方式也printf组的工作方式相类似,所不同的只是这些函数是从一个流中读取内容或者是在作为参数传递的指针地址处放置变量值.他们以同样的方式使用格式字符串来控制输入转换,而这些转义字符中的许多都是相同的.
其语法格式如下:
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *s, const char *format, ...);
在这里很重要的一点就是用来存放由scanf函数所读入值的变量必须是正确的类型而且必须与格式字符串进行精确的匹配.如果不是这样,我们的内存就会泄漏而我们的程序就可能崩溃.这些并不会出现编译错误,如果我们幸运的话,有可能会得到警告信息.
scanf及其相关的函数的格式字符串包含有普通字符和转义字符,而这些与printf相类似.然而普通字符是用来指定必须在输入中出现的字符.
如下面的一个简单的例子:
int num;
scanf(“Hello %d”, &num);
这 个scanf调用只有当在标准输入中的下五个字符与Hello匹配才会成功.然后,如果下一个字符形成一个可以识别的十进制数,这个数就会被读入而他的值 将会赋给变量num.在格式字符串中的空格是用来忽略输入中转义字符之间的任何空格符(空格,Tab,或是新行).这就意味着如果我们指定下面的输入形式 中的任何一个都会成功并会将1234存入变量num:
Hello     1234
Hello1234
在通常情况下,当转义开始时,空格符也会被忽略掉.这就意味着格式字符串%d将会一直从输入中读入,跳过任何空格以及新行直到发现一个数字充列.如果没有出现所希望的字符,转义就会失败,scanf函数返回.
如果我们不小心这样就会导致问题,如果在我们的程序中读入整数而输入中并没有数字字符,这样就会导致一个死循环.

除非注明,否则均为@武汉蒲公英网络工作室原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.aipgy.com/51625.html

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: