详解C语言中printf输出的相关函数
C语言printf()函数:格式化输出函数 int printf( char * format,... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束(' ')为止。 参数 format 字符串可包含下列三种字符类型:
格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。 printf()格式转换的一般形式如下: %(flags)(width)(. prec)type 以括号括起来的参数为选择性参数,而%与type 则是必要的,下面介绍 type 的几种形式。 1) 整数
2) 字符及字符串
prec 有几种情况:
width 为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度。 flags 有下列几种情况
【返回值】成功则返回写入的字符数目。 如果发生写入错误,将会设置文件错误标志(可通过 ferror() 检测),并返回一个负数。 如果在写入宽字符时一个多字节的字符发生编码错误,那么 errno 将被设置为 EILSEQ,并返回一个负数。 printf( format,... ) 等价于 fprintf(stdout,format,...),更多信息请参考 fprintf() 函数。 【实例】分别输出整数、浮点数和字符串。 #include<stdio.h> int main(void) { int a=1; float b=5.0; char str[100]= ""; scanf("%c %c %c",&a,&b,str); /*分别演示 整数*/ printf("int is:%dn",a); /*分别演示 浮点数*/ printf("float is:%fn",b); /*分别演示 字符串*/ printf("char is:%sn",str); return 0; } 输出结果: 1 4.4 fs int is:1 float is:4.400000 char is:fs 例子首先是等待用户输入整数浮点数和一个字符串,然后调用函数printf()按照对应的格式输出。 又如,输出更多格式的数据。 #include <stdio.h> int main() { printf ("Characters: %c %c n",'a',65); printf ("Decimals: %d %ldn",1977,650000L); printf ("Preceding with blanks: %10d n",1977); printf ("Preceding with zeros: %010d n",1977); printf ("Some different radices: %d %x %o %#x %#o n",100,100); printf ("floats: %4.2f %+.0e %E n",3.1416,3.1416); printf ("Width trick: %*d n",5,10); printf ("%s n","A string"); return 0; } 输出结果: Characters: a A Decimals: 1977 650000 Preceding with blanks: 1977 Preceding with zeros: 0000001977 Some different radices: 100 64 144 0x64 0144 floats: 3.14 +3e+000 3.141600E+000 Width trick: 10 A string C语言fprintf()函数:输出函数(格式化输出数据至文件) #include <stdio.h> 定义函数: int fprintf(FILE * stream,const char * format,...); 函数说明:fprintf()会根据参数format 字符串来转换并格式化数据,然后将结果输出到参数stream 指定的文件中,直到出现字符串结束(' ')为止。 返回值:关于参数format 字符串的格式请参考printf(). 成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno 中. 范例 #include <stdio.h> main() { int i = 150; int j = -100; double k = 3.14159; fprintf(stdout,"%d %f %x n",j,k,i); fprintf(stdout,"%2d %*dn",i,2,i); } 执行: -100 3.141590 96 150 150 C语言sprintf()函数:将格式化的数据写入字符串 #include <stdio.h> sprintf()函数用于将格式化的数据写入字符串,其原型为: int sprintf(char *str,char * format [,argument,...]); 【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。 除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数--格式化字符串--上。 printf()和sprintf()都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。 sprintf()最常见的应用之一莫过于把整数打印到字符串中,如:
sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。sprintf的第一个参数应该是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生非法操作,即将被关闭...."的提示。 sprintf()会根据参数format 字符串来转换并格式化数据,然后将结果复制到参数str 所指的字符串数组,直到出现字符串结束(' ')为止。关于参数format 字符串的格式请参考printf()。 【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。 注意:C语言对数组进行操作时并不检测数组的长度,如果str的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果,黑客经常利用这个弱点攻击看上去安全的系统。请看下面的代码: #include <stdio.h> main() { char buf[10]; sprintf(buf,"The length of the string is more than 10"); printf("%s",buf); } 编译并运行,屏幕上输出”The length of the string is more than 10“,同时系统提示程序已经停止。原因就是要写入的字符串的长度超过了buf的长度,造成缓冲区溢出。 使用snprintf()来代替sprintf()将能够很好的解决这个问题。 【实例】打印字母a的ASCII值。 #include <stdio.h> main() { char a = 'a'; char buf[80]; sprintf(buf,"The ASCII code of a is %d.",a); printf("%s",buf); } 运行结果: The ASCII code of a is 97. 又如,产生10个100以内的随机数并输出。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { char str[100]; int offset =0; int i=0; srand(time(0)); // *随机种子 for(i = 0;i<10;i++) { offset+=sprintf(str+offset,"%d,",rand()%100); // 格式化的数据写入字符串 } str[offset-1]='n'; printf(str); return 0; } 运行结果: 74,43,95,44,90,70,23,66,84 例子使用了一个新函数srand(),它能产生随机数。例子中最复杂的部分是for循环中每次调用函数sprintf()往字符数组写数据的时候,str+foffset为每次写入数据的开始地址,最终的结果是所有产生的随机数据都被以整数的形式存入数组中。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |