C语言printf()函数:格式化输出函数
printf()函数是最常用的格式化输出函数,其原型为:
int printf( char * format, ... );
printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束(\'\\0\')为止。
参数 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:%d\\n\",a); /*分别演示 浮点数*/ printf(\"float is:%f\\n\",b); /*分别演示 字符串*/ printf(\"char is:%s\\n\",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 %ld\\n\", 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, 100, 100, 100); printf (\"floats: %4.2f %+.0e %E \\n\", 3.1416, 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 指定的文件中, 直到出现字符串结束(\'\\0\')为止。
返回值:关于参数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 %*d\\n\", 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 所指的字符串数组,直到出现字符串结束(\'\\0\')为止。关于参数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,95,44,90,70,23,66,84
例子使用了一个新函数srand(),它能产生随机数。例子中最复杂的部分是for循环中每次调用函数sprintf()往字符数组写数据的时候,str+foffset为每次写入数据的开始地址,最终的结果是所有产生的随机数据都被以整数的形式存入数组中。
本文地址:https://www.stayed.cn/item/12937
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我