<cstdio>头文件
推荐资料:cppreference(中文),cppreference(英文)
(本章节中例子都是用 VS2005 编译调试的)
输出输入格式控制
基本格式字符
- %d 按十进制整数型数据的实际长度输出
- %i 作用与d格式字符相同
- %c 用来输出一个字符
- %s 用来输出一个字符串
- %f 用来输出实数 (含有6位小数)
- %e 用指数形式输出(例: 123.456 的指数形式为: 1.234560 e+002)
复杂格式字符
- %md m是指宽度,如果数位不够,左端以空格补出,如果大于位数m,按实际位数输出
int a,b; a=123; b=12345; printf("%4d,%4d\n",a,b); //输出a= 123,b=12345- %ld 是输出长整形数据的格式,占2字节的系统
- %0 以8进制整数形式输出(不带负号)
- %x 以十六进制整数形式输出(不带负号)
- %u 用来输出无符号型数据(unsigned)以十进制整数形式输出
- %mc m指宽度 输出的字符不够左补空格
- %m.ns m指字符串占n列,n表示只取字符串左端的n个字符,不够左补空格(m>n)
- %m.nf 指输出的数共占m列,其中有n位小数,如果数值长度小于m,则左补空格,若m为负值则右补空格
- %m.ne n指输出的数据的小数部分的小数位数 m为宽度
- %g 用来输出实数,它根据数值的大小自动选f格式或e格式,且不输出无意义的0,
- %ld %lo %lx %lu 中l表示long,输出为长整型数据
- %lf %le 输出double型数据
- %hd %hx %ho 输出短整型数据
基本输入输出
printf 格式输出
格式: int printf( const char *format [, argument]... );
参数:
- format:
- 说明:
- 是用双引号括起来的一字符串<"转换控制字符串"或"格式字符串">
- 组成:
- 格式声明:由"%"和格式字符组成
- 普通字符:需要原样输出地字符
- 说明:
- argument: 是需要输出的一些数据,可以是常量,变量或者表达式
sprintf 格式字符串
格式:int sprintf(char*string,char*format[,argument]... )
作用: 格式化一个字符串输出到字符数组中
参数:
- string: 存放格式话后字符串的字符数组
- format:
- 说明:
- 是用双引号括起来的一字符串<"转换控制字符串"或"格式字符串">
- 组成:
- 格式声明:由"%"和格式字符组成
- 普通字符:需要原样输出地字符
- 说明:
- argument:是需要输出的一些数据,可以是常量,变量或者表达式
注意:
- VC 的默认是 4 个字节对齐,就是当开辟一个不足四个字节的数组时,会为此数组分配 4 个字节的空间
- 在函数调用的过程中,是先将函数参数压入栈中,然后将函数调用完之后需要返回的地址压入栈中;在函数调用的过程中,还会有局部变量被压入栈中。当向赋值时数组超过数组的长度时,就会覆盖函数返回址,所有当函数用完就会出错
缺点: 使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误
例子:
#include <cstdlib> #include<cstdio> using namespace std; void main() { char* who = "this"; char* whom = "example"; char s[20]; sprintf(s,"%s is %s.",who,whom); //产生:"I love CSDN. " printf("%s\n",s); system("pause"); }
输出结果:
this is example.
请按任意键继续. . .
swprintf 宽字符格式输出
格式: int swprintf( wchar_t *buffer, const wchar_t *format [, argument] ... );
参数: 同上
_snprintf 格式输出
格式: int _snprintf(char *str, size_t size, const char *format[,argument]...);
作用: 格式化一个字符串输出到字符数组中
参数:
- str: 存放格式话后字符串的字符数组
- size: 该格式化后字符串最大可以赋给字符串的长度
- format:
- 说明:
- 是用双引号括起来的一字符串<"转换控制字符串"或"格式字符串">
- 组成:
- 格式声明: 由 "%" 和格式字符组成
- 普通字符: 需要原样输出地字符
- 说明:
- argument: 是需要输出的一些数据,可以是常量,变量或者表达式
注意:
- 如果格式化后的字符串长度 < size, 则将此字符串全部复制到 str 中,并给其后添加一个字符串结束符('\0');
- 如果格式化后的字符串长度 >= size, 则只将其中的(size-1)个字符复制到 str 中,并给其后添加一个字符串结束符('\0')
_snwprintf 宽字符格式输出
格式: int _snwprintf( wchar_t *buffer, size_t count, const wchar_t *format [, argument] ... );
参数: 同上
scanf 格式输入
格式: int scanf( const char *format [,argument]... );
参数:
- format: 由"%"和格式字符组成,然后在由在双引号中
- argument :由"&"地址符与变量名构成, "&变量名"是指变量在内存中的地址
sscanf 格式输入
格式: int sscanf( const char *buffer, const char *format [, argument ] ... );
作用: 格式化一个字符串输出到其输出列表的元素中
参数:
- buffer:用来格式输出的字符数组
- format:由"%"和格式字符组成,如果是多个中间由符号(除了"%")分开,然后在由在双引号中
- argument:由"&"地址符与变量名构成, "&变量名"是指变量在内存中的地址
注意:
- %[*] [width] [匹配样式]type
- *亦可用于格式中, (即 %*d 和 %*s) 加了星号(*)表示跳过此数据不读入. (也就是不把此数据读入参数中)
#include<cstdio> using namespace std; void main() { int i= 0; int j = 0; char s[20]; char input[]="10 0x1b aaaaaaaabbbbbbbb"; sscanf(input,"%d %*x %10[a-z]s",&i,s); //遇到 * 跳过匹配即跳过了 0x1b 这个数据 printf("%d %d %s \n",i,j,s); system("pause"); } /************************************** 输出结果: 10 0 aaaaaaaabb 请按任意键继续. . . **************************************/
- 支持转换成字符串的集合操作:
- %[a-z]表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) (要多个匹配时候%[a-z1-9A-B])
#include<cstdio> using namespace std; void main() { int i= 0; int j = 0; char s[20]; char input[]="10 0x1b abcdABCD"; sscanf(input,"%d %x %10[a-z]s",&i,&j,s);//只匹配 a 到 z 的元素遇到其他元素立即停止匹配 printf("%d %d %s \n",i,j,s); system("pause"); } /************************************* 输出结果: 10 27 abcd 请按任意键继续. . . *************************************/
- %[aB']匹配a、B、'中一员,贪婪性 (字符串第一个字符一定要是a或b不然会有不可预知的后果)
#include<cstdio> using namespace std; void main() { int i= 0; int j = 0; char s[20]; char input[]="10 0x1b aBzzaAbZ"; sscanf(input,"%d %x %10[aBz]s",&i,&j,s);//遇到非 a,B,z 其中一个离开停止匹配 printf("%d %d %s \n",i,j,s); system("pause"); } /*********************************** 输出结果: 10 27 aBzza 请按任意键继续. . . ***********************************/
- %[^a]匹配非a的任意字符,贪婪性 (a也可以为上两个表达式如a-z或者aB')
#include<cstdio> using namespace std; void main() { int i= 0; int j = 0; char s[20]; char input[]="10 0x1b aBZZbzza"; sscanf(input,"%d %x %10[^zb]s",&i,&j,s);//遇到 z 或者 b 马上停止匹配 printf("%d %d %s \n",i,j,s); system("pause"); } /************************************** 输出结果: 10 27 aBZZ 请按任意键继续. . . **************************************/
- width 表示读取宽度
- %[a-z]表示匹配a到z中任意字符,贪婪性(尽可能多的匹配) (要多个匹配时候%[a-z1-9A-B])
- 支持转换成数值的集合操作:
- width 表示读取宽度 (但是使用此属性时候,没读到的那部分数据会被当成一个新的数据)
- type 为格式字符
- *亦可用于格式中, (即 %*d 和 %*s) 加了星号(*)表示跳过此数据不读入. (也就是不把此数据读入参数中)
例子:
#include<cstdio> using namespace std; void main() { int i; unsigned int j; char s[20]; char input[]="10 0x1b aaaaaaaabbbbbbbb"; sscanf(input,"%d %x %10[a-z]s",&i,&j,s); printf("%d %d %s \n",i,j,s); system("pause"); }
输出结果:
10 27 aaaaaaaabb
请按任意键继续. . .
swscanf 宽字符格式输入
格式: int swscanf( const wchar_t *buffer, const wchar_t *format [, argument ] ... );
参数: 同上

浙公网安备 33010602011771号