当前位置:主页 > 软件编程 > C代码 >

详解C语言中printf输出的相关函数

时间:2021-04-13 09:16:07 | 栏目:C代码 | 点击:

C语言printf()函数:格式化输出函数
printf()函数是最常用的格式化输出函数,其原型为:

  int printf( char * format, ... );

printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束('\0')为止。

参数 format 字符串可包含下列三种字符类型:

  1. 一般文本,将会直接输出
  2. ASCII 控制字符,如\t、\n 等有特定含义
  3. 格式转换字符

格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。

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为每次写入数据的开始地址,最终的结果是所有产生的随机数据都被以整数的形式存入数组中。

您可能感兴趣的文章:

相关文章