当前位置:文档之家› C语言中scanf用法运用和意义

C语言中scanf用法运用和意义

C语言中scanf用法运用和意义
C语言中scanf用法运用和意义

C语言中sccanf用法、运用和意义

vavsscanf用法以及正则表达式的运用

表头文件#include(stdio.h)

定义函数int sscanf (const char *str,const char * format,........);

函数说明sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。

返回值成功则返回参数数目,失败则返回-1,错误原因存于errno中。

周星星的代码:

#include

int main()

{

const char* s = "iios/12DDWDFF@122";

char buf[20];

sscanf( s, "%*[^/]/%[^@]", buf );

printf( "%s\n", buf );

return 0;

}

结果为:12DDWDFF

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:

int scanf( const char *format [,argument]... );

其中的format可以是一个或多个{%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号},

注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

width:宽度,一般可以忽略,用法如:

const char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符

cout << buf<< endl;

结果为:hello

{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double 例外),l64表示8字节size。

type :这就很多了,就是%s,%d之类。

特别的:

%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

const char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了cout << buf<< endl;

结果为:world

支持集合操作:

%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB'] 匹配a、B、'中一员,贪婪性

%[^a] 匹配非a的任意字符,贪婪性

1. 常见用法。

以下是引用片段:

charstr[512]={0};

sscanf("123456","%s",str);

printf("str=%s

",str);

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

以下是引用片段:

sscanf("123456","%4s",str);

printf("str=%s

",str);

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

以下是引用片段:

sscanf("123456abcdedf","%[^]",str);

printf("str=%s

",str);

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

以下是引用片段:

sscanf("123456abcdedfBCDEF","%[1-9a-z]",str);

printf("str=%s

",str);

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

以下是引用片段:

sscanf("123456abcdedfBCDEF","%[^A-Z]",str);

printf("str=%s",str);

搜集一些特殊用法:

%[ ] 的用法:%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。

[ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可

导致不可预知的结果。%[^]也是违反规定的。

%[a-z] 读取在a-z 之间的字符串,如果不在此之前则停止,如

char s[]="hello, my friend”; // 注意: ,逗号在不a-z之间

sscanf( s, “%*a-z+”, string ) ; // string=hello

%[^a-z] 读取不在a-z 之间的字符串,如果碰到a-z之间的字符则停止,如

char s[]="HELLOkitty”; // 注意: ,逗号在不a-z之间

sscanf( s, “%*^a-z+”, string ) ; // string=HELLO

%*[^=] 前面带* 号表示不保存变量。跳过符合条件的字符串。

char s[]="notepad=1.0.0.1001" ;

char szfilename [32] = "" ;

int i = sscanf( s, "%*[^=]", szfilename ) ;

// szfilename=NULL,因为没保存

int i = sscanf( s, "%*[^=]=%s", szfilename ) ;

// szfilename=1.0.0.1001

%40c 读取40个字符

%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:

char s[]="notepad=1.0.0.1001" ;

char szfilename [32] = "" ;

int i = sscanf( s, "%[^=]", szfilename ) ;

// szfilename=notepad

如果参数格式是:%[^=:] ,那么也可以从notepad:1.0.0.1001读取notepad 参考:

https://www.doczj.com/doc/cf3423207.html,/beingstudio/articles/1806661.aspx

https://www.doczj.com/doc/cf3423207.html,/lbird/blog/item/07e09c8282dbe992f703a6b0.html

https://www.doczj.com/doc/cf3423207.html,/yinjianren/blog/item/28dce5ca75e30585c9176896.html

sscanf/scanf特殊用法

2007-08-03 13:55

%[ ] 的用法:%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。

[ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可

导致不可预知的结果。%[^]也是违反规定的。

%[a-z] 读取在a-z 之间的字符串,如果不在此之前则停止,如

char s[]="hello, my friend”; // 注意: ,逗号在不a-z之间

sscanf( s, “%*a-z+”, string ) ; // string=hello

%[^a-z] 读取不在a-z 之间的字符串,如果碰到a-z之间的字符则停止,如

char s[]="HELLOkitty”; // 注意: ,逗号在不a-z之间

sscanf( s, “%*^a-z+”, string ) ; // string=HELLO

%*[^=] 前面带* 号表示不保存变量。跳过符合条件的字符串。

char s[]="notepad=1.0.0.1001" ;

char szfilename [32] = "" ;

int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL,因为没保存

int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001

%40c 读取40个字符

The run-time

library does not automatically append a null terminator

to the string, nor does reading 40 characters

automatically terminate the scanf() function. Because the

library uses buffered input, you must press the ENTER key

to terminate the string scan. If you press the ENTER before

the scanf() reads 40 characters, it is displayed normally,

and the library continues to prompt for additional input

until it reads 40 characters

%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:

char s[]="notepad=1.0.0.1001" ;

char szfilename [32] = "" ;

int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad

如果参数格式是:%[^=:] ,那么也可以从notepad:1.0.0.1001读取notepad

使用例子:

char s[]="notepad=1.0.0.1001" ;

char szname [32] = "" ;

char szver *32+ = “” ;

sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001

总结:%[]有很大的功能,但是并不是很常用到,主要因为:

1、许多系统的scanf 函数都有漏洞. (典型的就是TC 在输入浮点型时有时会出错).

2、用法复杂, 容易出错.

3、编译器作语法分析时会很困难, 从而影响目标代码的质量和执行效率.

个人觉得第3点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理。

scanf用法

scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Dennis M.Ritchie的“hello,world”程序基本上是所有的C语言学习者第一个范例),所以scanf()函数应当是C学习者能熟练运用的一个函数,但有很多初学者对此函数不能很好的运用,在实际编程中错误使用scanf()函数,导至程序产生某种错误不能正常运行,以至产生“scanf()函数有BUG”,“scanf()函数无用论”等等错误观点。 本文结合笔者在编程实践中及论坛上网友所遇到的问题作一释疑,但笔者水平有限(菜鸟级),难免有谬误之处,还望达人指点一二。(Email:knocker.k@https://www.doczj.com/doc/cf3423207.html,) 本文分上,下两篇讲述了C语言中的scanf()函数的用法,重点阐述使用scanf()函数过程中出现的常见错误及对策。当然,文中某些解决方法,均可以采用其他函数和方法来更好地解决,但本文仅限讨论scanf()函数本身。 上篇,详细介绍了scanf()函数控制串的构成。下篇,用实际例程介绍scanf()函数控制串运用出现的常见错误及对策技巧。 二、scanf()函数的控制串 函数名: scanf 功能: 执行格式化输入 用法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF。 其控制串由三类字符构成: 1。格式化说明符; 2。空白符; 3。非空白符; (A)格式化说明符

C语言输入输出函数printf与scanf的用法格式

C 语言输入输出函数printf 与scanf 的用法格式 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式控制字符, 以"%"开始, 后跟一个或几个控制字符,用来确定输出内容格式。 参量表是需要输出的一系列参数,可以是常量、变量或表达式,其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。 例如: printf("a=%d b=%d",a,b); 1. 格式控制符Turbo C 2.0提供的格式化规定符如下: 格式控制字符 参量表 正常字符

━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e,%E 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g,%G 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ printf的附加格式说明字符 字符说明 l 用于长整型数或双精度实型,可加在格式 符d、o、x、u和f前面 m(代表一个正整数据最小输出显示宽度

c++ printf使用及参数详解

c++ printf使用及参数详解 1.调用格式为 printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。 2.格式化字符 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 说明: (1). 可以在"%"和字母之间插进数字表示最大场宽。例如: %3d 表示输出3位整型数, 不够3位右对齐。%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。超过9位,按实际输出。%8s 表示输出8个字符的字符串, 不够8个字符右对齐。如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。另外, 若想在输出值前加一些0, 就应在场宽项前加个0。例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。 (2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。例如: %ld 表示输出long整数, %lf 表示输出double浮点数。 (3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。例如: %-7d 表示输出7位整数左对齐,%-10s 表示输出10个字符左对齐。 3. 一些特殊规定字符 \n换行 \f清屏并换页 \r回车 \t Tab符 \xhh表示一个ASCII码用16进表示, 其中hh是1到2个16进制数

自己写的printf()和scanf()函数

自己来写printf()和scanf()函数 一、预备知识——C语言中的可变参数函数 1.先举一个例子: #define bufsize 80 char buffer[bufsize]; /**************************************************************** * 这个函数用来格式化带参数的字符串 *****************************************************************/ int vspf(char *fmt, ...) { va_list argptr; //声明一个转换参数的变量 int cnt; va_start(argptr, fmt); //初始化变量 //将带参数的字符串按照参数列表格式化到buffer中 cnt = vsnprintf(buffer,bufsize ,fmt, argptr); va_end(argptr); //结束变量列表,和va_start成对使用 return(cnt); } /**************************************************************** * 主函数 *****************************************************************/ int main(int argc, char* argv[]) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf("%s\n", buffer); return 0; } 下面我们来探讨如何写一个简单的可变参数的C函数. 2.写可变参数的C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr );

C语言Printf之使用及在单片机中的用法

一、printf常用说明 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 ---------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。

C语言printf函数详解

功能: 产生格式化输出的函数。 用法: printf(格式控制字符串,参数1,参数2,…,参数n); 格式控制字符串定义为: %[flags][width][.perc][F|N|h|l]type type d有符号10进制整数 i有符号10进制整数 o无符号8进制整数 u无符号10进制整数 x无符号的16进制数字,并以小写abcdef表示 X无符号的16进制数字,并以大写ABCDEF表示 f浮点数 E/e用科学记数法表示浮点数 g用%f和%e表示中,总的位数最短的来表示浮点数。G同g格式,但表示为指数c单个字符 s字符串 S wchar_t字符(宽字符)类型字符串 %显示百分号本身 p显示一个指针,near指针表示为:XXXX,far指针表示为:XXXX:YYYY n相连参量应是一个指针,其中存放已写字符的个数 flags:规定输出格式 无右对齐,左边填充0和空格 -左对齐,右边填充空格 +在数字前增加符号+或- 0 将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用-) 空格输出值为正时冠以空格,为负时冠以负号 #当type=c,s,d,i,u时没有影响;当type=o,x,X时,分别在数值前增加'0',"0x","0X"; 当type=e,E,f时,总是使用小数点;当type=g,G时,除了数值为0外总是显示小数点。 width:用于控制显示数值的宽度 n(n=1,2,3...)宽度至少为n位,不够以空格填充 0n(n=1,2,3...)宽度至少为n位,不够左边以0填充 *格式列表中,下一个参数还是width prec:用于控制小数点后面的位数 无按缺省精度显示 0当type=d,i,o,u,x时,没有影响;当type=e,E,f时,不显示小数点 n(n=1,2,3...)当type=e,E,f时,表示的最大小数位数

printf和scanf

格式化占位符[编辑] 格式化字符串中的占位符用于指明输出的参数值如何格式化。格式化占位符(format placeholder) 语法是: %[parameter][flags][field width][.precision][length]type Parameter可以忽略或者是: Flags可为0个或多个:

Field Width给出显示数值的最小宽度,典型用于制表输出时填充固定宽度的表目。实际输出字符的个数不足域宽,则根据左对齐或右对齐进行填充。实际输出字符的个数超过域宽并不引起数值截断,而是显示全部。宽度值的前导0被解释为0填充标志,如上述;前导的负值被解释为其绝对值,负号解释为左对齐标志。如果域宽值为*,则由对应的函数参数的值为当前域宽。 Precision通常指明输出的最大长度,依赖于特定的格式化类型。对于d、i、u、x、o的整型数值,是指最小数字位数,不足的位要在左侧补0,如果超过也不截断,缺省值为1。对于a,A,e,E,f,F的浮点数值,是指小数点右边显示的数字位数,必要时四舍五入;缺省值为6。对于g,G的浮点数值,是指有效数字的最大位数。对于s的字符串类型,是指输出的字节的上限,超出限制的其它字符将被截断。如果域宽为*,则由对应的函数参数的值为当前域宽。如果仅给出了小数点,则域宽为0。 Length指出浮点型参数或整型参数的长度。此项Microsoft称为“Size”。可以忽略,或者是下述:

此外,在ISO C99广泛接受前,还有几个平台相关的length选项: ISO C99的头文件inttypes.h包含了许多宏,用于平台独立的printf编码。例如:

单片机程序巧用printf

单片机程序巧用printf 当我们在调试代码时,通常需要将程序中的某个变 量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方 式输出变量名和变量的值。 printf函数在使用时,不仅仅要初始化串口,还需要其 它的一些设置或者要调用其它的一些函数否则printf 函数将不能按我们想要的方式执行。 由于不同的编译器studio函数不一样,所以使用的方法也不一样,这需要大家去看编译器的help帮助选项,这里我们以STM32、51和AVR整理了几个串口打印程序,供需要的朋友参考。 1、在KEIL下使用printf函数,以STM32为例 在uart.c中添加如下代码 View Code /************************************************ ******************************* 函数名:fputc 输入: 输出:

功能说明: 重定义putc函数,这样可以使用printf函数从串口 1打印输出 ************************************************* ******************************/ int fputc(int ch, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } /************************************************ ******************************* 函数名:fputc 输入:

Printf格式

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为参数的最小长度,若此栏并非数值,而是*

单片机中printf函数的运用

51中printf使用注意 C51标准串口发送程序(已C8051F120为例,注意C8051F120特殊功能寄存器是分页的) /*********************************************************** 函数名称:send_char_com 函数功能:向串口发送一字节字符 入口参数:unsigned char sendByte 一个字节字符(8 bit) 出口参数:无 备注: ***********************************************************/ void send_char_com(unsigned char sendByte) { char SFRPAGE_SA VE = SFRPAGE; //用到TI0(SCON0.1)SFR页:0 SFRPAGE = UART0_PAGE; SBUF0=sendByte; while (TI0== 0); //等待发送完毕 TI0= 0; //清发送中断标志TI0 SFRPAGE = SFRPAGE_SA VE; } /*********************************************************** 函数名称:send_char_com 函数功能:向串口发送一个字符串 入口参数:unsigned char *str 字符串数组首地址 unsigned int strlen 该字符串长度 出口参数:无 备注: ***********************************************************/ void send_string_com( unsigned char *str, unsigned int strlen) { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < strlen); } 在C51中直接使用printf比自己编个串口发送字符串的函数方便,但有几个问题要注意的。 1. 使用printf之前要先包含stdio.h这个头文件 #include 具体stdio.h包含的函数见下面网址 https://www.doczj.com/doc/cf3423207.html,/support/man/docs/c51/c51_stdio_h.htm 2.

printf格式化输出详解

printf()格式化输出详解 2009年03月28日星期六 13:39 本文来自:https://www.doczj.com/doc/cf3423207.html,/language/20080420/7060.html printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 --------------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。 ⑥s格式:用来输出一个串。有几中用法 %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。

printf函数

在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后一个参数 倒数第二个参数 ... 第一个参数 函数返回地址 函数代码段 static int printf(const char *fmt,...) { va_list args; int i; va_start(args,fmt); write(1,printfbuf,i=vsprintf(printbuf,fmt,args)); va_end(args); return i; } 1、#include 头文件 2、const char *fmt const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性. fmt为可变参数的前一个参数。控制字符串写入%d,%f的地方 70 va_start(args,fmt)是为了使fmt指向第一个可选参数 void va_start(va_list ap, last) va_start必须第一个调用,它初始化va_list类型的变量ap,使ap指向第一个可选参数。参数last 是可变参数列表(即函数原型中的省略号…)的前一个参数的名字,也就是最后类型已确定的函数参数名。因为这个参数的地址将会被宏va_start用到,所以最好不要是寄存器变量,函数,或者数组。 va_end(args)结束可变参数的获取

C语言Printf和Scan函数的使用方法

C语言Printf和Scan函数的使用方法 一printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想 不到的错误。 格式化字符串的格式是: %[标志][输出最小宽度][.精度][长度]格式字符 1. 标志:标志字符为-、+、#、空格四种,其意义下表所示: 标志意义 - 结果左对齐,右边填空格 + 输出符号(正号或负号) 空格输出值为正时冠以空格,为负时冠以负号 # 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点(??????) 例1: #include main() { int a=100; float b=123.255; printf("a=%d ",a); printf("a=%10d ",a); printf("a=%-10d ",a); printf("a=%+d ",a); printf("a=% d ",a); printf("a=%#o ",a); printf("a=%#x ",a); printf("b=%#f ",b); } 运行结果 a=100

C语言格式输出函数printf

C语言格式输出函数printf()详解标题 4.1.1printf函数(格式输出函数) printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。 1.printf函数调用的一般形式 printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。printf函数调用的一般形式为: printf(“格式控制字符串”,输出表列) 其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如: “%d”表示按十进制整型输出; “%ld”表示按十进制长整型输出; “%c”表示按字符型输出等。 非格式字符串在输出时原样照印,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。 【例4.3】 main() { int a=88,b=89; printf("%d %d\n",a,b); printf("%d,%d\n",a,b); printf("%c,%c\n",a,b); printf("a=%d,b=%d",a,b); } 本例中四次输出了a,b的值,但由于格式控制串不同,输出的结果也不相同。第四行的输出语句格式

控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号,因此输出 的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出a,b值。第七行中为了提示输出结果又增加了非格式字符串。 2.格式字符串 在Turbo C中格式字符串的一般形式为: [标志][输出最小宽度][.精度][长度]类型。其中方括号[]中的项为可选项。 各项的意义介绍如下: 1.类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示:

C语言中Printf和Scanf 的使用方法详细

C语言中Printf和Scanf 的使用方法详细 Printf和Scan函数的使用方法 一printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意 想 不到的错误。 格式化字符串的格式是: %[标志][输出最小宽度][.精度][长度]格式字符 1. 标志:标志字符为-、+、#、空格四种,其意义下表所示: 标志意义 - 结果左对齐,右边填空格 + 输出符号(正号或负号) 空格输出值为正时冠以空格,为负时冠以负号 # 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小 数时才给出小数点(??????)例1: #i nclude main() { int a=100; float b=123.255; printf("a=%d ",a); printf("a=d ",a); printf("a=%-10d ",a); printf("a=%+d ",a); printf("a=% d ",a);

printf("a=%#o ",a); printf("a=%#x ",a); printf("b=%#f ",b); } 运行结果 a=100 a= 100 a=100 a=+100 a= 100 a=0144 a=0x64 b=123.254997 (?????) 2.输出最小宽度:用十进制整数来表示输出的最少位数。(至少要输出这么多位!) 若实际位数多于定义的宽度:则按实际位数输出。 若实际位数少于定义的宽度:则右对齐,左边留空。 有负号,左对齐,右边留空 表示宽度的数字以0开始,则右对齐,左边留空。 例2 #i nclude main() { int a=3456; printf("a== ",a); //若实际位数多于定义的宽度:则按实际位数输出 printf("a=d ",a); //若实际位数少于定义的宽度:则右对齐,左边留空 printf("a=%-10d ",a); //若实际位数少于定义的宽度:有负号,左对齐,右边留空 printf("a=0d ",a); //若实际位数少于定义的宽度:表示宽度的数字以0开始,则右对齐,左边留空 printf("a=%-010d ",a); //左对齐,0无意义。 } 运行结果: a=3456 a= 3456 a=3456

keil中的printf使用格式

C语言之printf使用及其在单片机中的用法- XiaoXiaopig's home的blog | 嵌入式在线博客博客首页| 嵌入式在线首页| 帮助| 收藏XiaoXiaopig's home 坐看庭前花开花落Love to be loved by you _ _小pig注册| 登录| 发表文章 ,欢迎您短消息| 发表文章| 退出首页文章相册下载部落好友留言管理后台 C语言之printf使用及其在单片机中的用法37030104728 2010-4-26 11:50:10 收藏| 打印| 投票(5) | 评论(0) | 阅读(24843) ◇字体:[大中小] 一、printf常用说明 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。---------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。

printf函数中常用的格式说明

3.2.2 printf函数中常用的格式说明 格式控制中,每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之间可以根据需要插入“宽度说明”、左对齐符号“-”、前导零符号“0"等。 1.格式字符 %后允许使用的格式字符和它们的功能如表3.1所示。在某些系统中,可能不允许使用大写字母的格式字符,因此为了使程序具有通用性,在写程序时应尽量不用大写字母的格式字符。 2.长度修饰符 在%和格式字符之间,可以加入长度修饰符,以保证数据输出格式的正确和对齐。对于长整型数(long)应该加l,即%ld;对于短整型数(short)可以加h,即%hd。 3.输出数据所占的宽度说明 当使用%d,%c,%f,%e,%s,…的格式说明时,输出数据所占的宽度(域宽)由系统决定,通常按照数据本身的实际宽度输出,前后不加空格,并采用右对齐的形式。也可以用以下三种方法人为控制输出数据所占的宽度(域宽),按照使用者的意愿进行输出。 (1)在%和格式字符之间插入一个整数常数来指定输出的宽度n(例如%4d,n代表整数4)。如果指定的宽度n不够,输出时将会自动突破,保证数据完整输出。如果指定的宽度n超过

输出数据的实际宽度,输出时将会右对齐,左边补以空格,达到指定的宽度。 (2)对于float和double类型的实数,可以用“n1.n2”的形式来指定输出宽度(n1和n2分别代表一个整常数),其中n1指定输出数据的宽度(包括小数点),n2指定小数点后小数位的位数,n2也称为精度(例如%12.4f,n1代表整数12 ,n2代表整数4)。 对于f,e或E,当输出数据的小数位多于n2位时,截去右边多余的小数,并对截去部分的第一位小数做四舍五入处理;当输出数据的小数位少于n2时,在小数的最右边补0,使得输出数据的小数部分宽度为n2。若给出的总宽度n1小于n2加上整数位数和小数点(e或E 格式还要加上指数的5位),则自动突破n1的限制;反之,数字右对齐,左边补空格。 也可以用“.n2”格式(例如%.6f),不指定总宽度,仅指定小数部分的输出位数,由系统自动突破,按照实际宽度输出。如果指定“n1.0”或“.0”格式(例如%12.0f或%.0f),则不输出小数点和小数部分。 对于g或G,宽度用来指定输出的有效数字位数。若宽度超过数字的有效数字位数,则左边自动补0;若宽度不足,则自动突破。不指定宽度,将自动按照b位有效数字输出,截去右边多余的小数,并对截去部分的第一位小数做四舍五入处理。 (3)对于整型数,若输出格式是“0n1”或“.n2”格式(例如%05d或%.5d},则如果指定的宽度超过输出数据的实际宽度,输出时将会右对齐,左边补0。 对于float和double类型的实数,若用“0n1”或“n2”格式输出(例如%012.4f),如果给出的总宽度n1大于n2加上整数位数和小数点(e或E格式还要加上指数的5位),则数字右对齐,左边补0。 对于字符串,格式“n1”指定字符串的输出宽度,若n1小于字符串的实际长度,则自动突破,输出整个字符串;若n1大于字符串的实际长度,则右对齐,左边补空格。若用“.n2”格式指定字符串的输出宽度,则若n2小于字符串的实际长度,将只输出字符串的前n2个字符。 注意:输出数据的实际精度并不完全取决于格式控制中的域宽和小数的域宽,而是取决于数据在计算机内的存储精度。通常系统只能保证float类型有7位有效数字,double类型有15位有效数字。若你指定的域宽和小数的域宽超过相应类型数据的有效数字,输出的多余数字是没有意义的,只是系统用来填充域宽而已。 4.输出数据左对齐 通常输出数据都隐含右对齐,如果想左对齐,可以在格式控制中的“%”和宽度之间加一个“-”号来实现。 5.使输出数据总带+号或-号 通常输出的数据如果是负数,前面有符号“-”,但正数前面的“+”一般都省略了。如果要每一个数前面都带正负号,可以在“%”和格式字符间加一个“+”号来实现。 表3.2列举了各种输出宽度和不指定宽度情况下的输出结果(表中输出结果中时符号j 代表一个空格),其中k为int型,值为1234;f为float型,值为123.456。

printf用法---printf输出固定长度的字符

printf用法---printf输出固定长度的字符 需要打印一个固定长度的字符 一般可以这么做: void str_print(const char* str, unsigned int str_len) { int i=0; for (; i < str_len; i++) printf("%c", str[i]); printf("\n"); } 但是用一行代码也可以搞定: printf("%.*s\n", str_len, str); printf一般用法:

ref : https://www.doczj.com/doc/cf3423207.html,/yuaqua/archive/2011/10/21/2219856.ht ml 小数点.后“*”表示输出位数,具体的数据来自参数表 printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”。 同样,小数点.前也可以添加*,也要用户输入一个位宽值来代替,表示输出的字符所占位宽。 #include <cstdio> #include <iostream> int main() { char *s = "this is test example"; int a,b; printf("%.*s\n", 10, s);//这里的常量10就是给*号的,你也可以用一个变量来控制宽度

printf("%*.*s\n", 20, 10, s);//常量20控制输出所占位宽,也可以用一个变量控制 std::cin>>a>>b; //输入15 10 printf("%*.*s\n", a, b, s);//输出为:-----this is te std::cin.get(); std::cin.ignore();//暂停程序执行 } 输出结果为: this is te ----------this is te//-代表空格 15 10 //输入 -----this is te注:printf的一般形式为printf("格式控制字符串",输出列表),格式控制字符串形式为:[标志][输出最小宽度][.精度][长度]类型。 其中方括号[]中的项为可选项。各项的意义介绍如下:1)类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示: d 以十进制形式输出带符号整数(正数不输出符号)

使用keiL中的printf和scanf进行串口的调试

使用keiL 中的printf 和scanf 进行串口的调试 1、printf( )和scanf(在包含在stdio.h 中 库函数printf( )的发送原理:首先在初始化时要把TI 置1,如果不这样做,你的程序是会一直在JNB TI ,$这条指令上跑 ,: printf( ) 库函数发送流程图 库函数scanf( )的接收原理: 2、使用 C51输入输出函数都是通过串行口工作的,因此,要使用这类函数必须对单片机的串行口进行设置和初始化,如串口模式的选择和波特率的设定等等。 在需要使用printf 函数时需要对串口进行初始化: SCON= 0x52; /*0101,0010:方式1,REN=1允许接收,8-bit UART ,TI= 1; RI=0 */ PCON=0; /*SMOD=0*/ TMOD |= 0x20; /*TMOD :定时器T1,工作模式2, 8位自动重载方式,在这里用"|="是为不影响T0的工作*/ TH1= 0xf3; /*当波特率为2400时,定时器初值*/ TL1= 0xf3; TR1= 1; /*定时器T1开始运行*/ TI= 1; /*在SCON 中已经设置,允许发送数据*/

(1)数码管,用于观察是否从串口读得数据 (2)上面虚拟终端观察单片机接受的外部信号是否有(3)下面虚拟终端观察单片机发送的信号 (4)P1是虚拟串口COMPIM,必须与虚拟串口软件联用 软件 虚拟仪器设置

运行 (1)产生HEX (2)装载HEX (3)打开虚拟串口

实验结果: 实现了单片机此案串口发送提示信号,please input(1-9),等待从串口反馈的的信号,当在串口调试器中发送去输入7,发送后,上面一个虚拟终端显示7,当单片机接受该信号后,显示出来,并进行运算,结果再次送到串口。

printf用法详解

printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。函数的原型为: int printf(const char *format, ...); 函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。 printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想 不到的错误。 注意:函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的。 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: a 符号作用 —————————————————————————— %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 说明: (1). 可以在"%"和字母之间插进数字表示最大场宽。 例如: %3d 表示输出3位整型数, 不够3位右对齐。 %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。 %8s 表示输出8个字符的字符串, 不够8个字符右对齐。 如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。 但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。 另外, 若想在输出值前加一些0, 就应在场宽项前加个0。 例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度 为4位。 如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,

相关主题
文本预览
相关文档 最新文档