首页 > 代码库 > C之printf()函数

C之printf()函数

  在C语言中,printf()是最常用的输出函数。printf()的使用很简单,如要打印Hello,World!这个字符串,只需运行:

 

printf("Hello,World!");

这样就会在屏幕上输出hello,World!这个字符串。

  printf不仅可以输出常量,还可以输出变量。如要打印上面的字符,还可以:

#include<stdio.h>#define HW "Hello,World!"int main(void){      printf("%s", HW);      return 0;      }

其中"%s"是一个转换说明符,表示将要输出的是一个字符串,后面的HW则是要打印的字符串。

  使用这种方式,在printf中可以使用多个转换说明符,需特别注意的是,""(双引号)中转换说明符的个数和类型必须与后面的参数完全一致,否则可能会不能输出或得不到想要的结果。

  这里有一个情况需特别注意,先看下面的程序:

 

 #include<stdio.h>    int main(void)  {          float n1 = 123.45;          float n2 = 456.78;          long n3 = 12000000;          long n4 = 34000000;            printf("n1 = %ld, n2 = %ld, n3 = %ld, n4 = %ld\n", n1, n2, n3, n4);          return 0;  }

在这段代码中,试图使用转换说明符%ld打印float型和long型数据,其输出结果为:

n1 = -1073741824, n2 = 1079958732, n3 = -536870912, n4 = 1081904250

其结果完全错误。这中错误与printf()函数的打印过程有关,下面重点介绍。

  当执行上面的printf那一句时,后面的n1,n2,n3,n4这4个参数被传送到内存中的堆栈中,但是,float型数据会被当做double型处理,即占8个字节,而long型占4个字节。而打印数据时则是根据转换说明符的类型决定。由于上面都使用了%ld即long型的转换说明符,在打印n1时实际从堆栈中取出的是n1的前4个字节,并将其转换成一个long型数据输出。打印n2时实际取出的是n1的后4个字节。以此类推,在打印n3,n4时,虽然转换说明符匹配(都是long型),但实际取出的是n2的前4和后4个数据并输出,所以结果是完全错误的。

C之printf()函数