【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)

简介: printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。

printf


函数原型

int printf ( const char * format, ... );
  • const char * format, ... 为可变参数类型


基本用法


printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format格式化),表⽰可以定制输出⽂本的格式。

#include <stdio.h>
int main(void) 
{
    printf("Hello World");
    return 0;
}

上⾯命令会在屏幕上输出⼀⾏⽂字“Hello World”。

printf不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。

为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n

#include <stdio.h>
int main(void) 
{
    printf("Hello World\n");
    return 0;
}

如果⽂本内部有换⾏,也是通过插⼊换⾏符来实现,如下⽅代码:

#include <stdio.h>
int main(void) 
{
    printf("Hello\nWorld\n");
    printf("Hello\n");
    printf("World\n");
    return 0;
}

printf 是在标准库的头⽂件 stdio.h 定义的。使⽤这个函数之前,必须在源⽂件头部引⼊这个头⽂件


占位符


printf可以在输出⽂本中指定占位符。

所谓“占位符”,就是这个位置可以⽤其他值代⼊。

// 输出 There are 3 apples 
int main()
{
    printf("There are %d apples\n", 3);
    return 0;
}

上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这 ⾥代⼊的值必须是⼀个整数


printf 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果 就是 There are 3 apples


常⽤的占位符除了 %d ,还有 %s 表⽰代⼊的是字符串


#include <stdio.h>
int main()
{
    printf("%s will come tonight\n", "zhangsan");
    return 0;
}

上⾯⽰例中, %s 表⽰代⼊的是⼀个字符串,所以 printf的第⼆个参数就必须是字符串,这个例⼦是 zhangsan 。执⾏后的输出就是 zhangsan will come tonight


同时对于字符或者字符串,可以不用占位符直接打印:

#include <stdio.h>
int main()
{
    printf("zahngsan will come tonight\n");
    printf('3');
    return 0;
}

输出⽂本⾥⾯可以使⽤多个占位符

#include <stdio.h>
int main()
{
    printf("%s says it is %d o'clock\n", "lisi", 21);
    return 0;
}

上⾯⽰例中,输出⽂本 %s says it is %d o'clock 有两个占位符,第⼀个是字符串占位 符 %s ,第⼆个是整数占位符 %d ,分别对应 printf 的第⼆个参数( lisi )和第三个参数 ( 21 )。执⾏后的输出就是 lisi says it is 21 o'clock


printf参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf 可能会输出内存中的任意值。


占位符列举


printf的占位符有许多种类,与C语⾔的数据类型相对应。下⾯按照字⺟顺序,列出常⽤的占位符,⽅便查找。


重点记忆的加粗部分,其他的用的时候查找即可


  • %a :⼗六进制浮点数,字⺟输出为⼩写。
  • %A :⼗六进制浮点数,字⺟输出为⼤写。
  • %c :字符
  • %d :⼗进制整数。//int
  • %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
  • %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
  • %i :整数,基本等同于 %d 。
  • %f :单精度浮点数//float(默认小数点后六位)
  • %lf:双精度浮点数//double(默认小数点后六位)
  • %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e 为⼩写。
  • %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
  • %hd :⼗进制short int类型。
  • %ho :⼋进制short int类型。
  • %hx :⼗六进制short int类型。
  • %hu :unsigned short int类型。
  • %ld :⼗进制long int类型。
  • %lo :⼋进制long int类型。
  • %lx :⼗六进制long int类型。
  • %lu :unsigned long int类型。
  • %lld :⼗进制long long int类型。
  • %llo :⼋进制long long int类型。
  • %llx :⼗六进制long long int类型。
  • %llu :unsigned long longint类型。
  • %Le :科学计数法表⽰的long double类型浮点数。
  • %Lf :long double类型浮点数。
  • %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
  • %o :⼋进制整数。
  • %p :指针(⽤来打印地址)
  • %s :字符串。
  • %u :⽆符号整数(unsigned int)
  • %x :⼗六进制整数。
  • %zd : size_t 类型。
  • %% :输出⼀个百分号。


输出格式


printf 可以定制占位符的输出格式。


限定宽度


printf 允许限定占位符的最⼩宽度。

#include <stdio.h>
int main()
{
    printf("%5d\n", 123); // 输出为 " 123" 
    return 0;
}

上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。


输出的值默认是右对⻬,即输出内容前⾯会有空格;


如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。

#include <stdio.h>
int main()
{
    printf("%-5d\n", 123); // 输出为 "123 " 
    return 0;
}

上⾯⽰例中,输出内容 123 的后⾯添加了空格。

对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。

// 输出 " 123.450000" 
#include <stdio.h>
int main()
{
    printf("%12f\n", 123.45);
    return 0;
}

上⾯⽰例中, %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位, 所以 123.45 输出结果的头部会添加2个空格。


显示正负号


默认情况下, printf不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可 以在占位符的 % 后⾯加⼀个 + 。


#include <stdio.h>
int main()
{
    printf("%+d\n", 12); // 输出 +12 
    printf("%+d\n", -12); // 输出 -12 
    return 0;
}

上⾯⽰例中, %+d 可以确保输出的数值,总是带有正负号。


限定小数位数


输出⼩数时,有时希望限定⼩数的位数。

举例来说,希望⼩数点后⾯只保留两位,占位符可以写 成 %.2f

// 输出 Number is 0.50 
#include <stdio.h>
int main()
{
    printf("Number is %.2f\n", 0.5);
    return 0;
}

上⾯⽰例中,如果希望⼩数点后⾯输出3位( 0.500 ),占位符就要写成 %.3f

这种写法可以与限定宽度占位符,结合使⽤。

// 输出为 " 0.50" 
#include <stdio.h>
int main()
{
    printf("%6.2f\n", 0.5);
    return 0;
}

上⾯⽰例中, %6.2f 表⽰输出字符串最⼩宽度为6,⼩数位数为2。所以,输出字符串的头部有两个空格。

最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf 的参数传⼊。

#include <stdio.h>
int main()
{
 printf("%*.*f\n", 6, 2, 0.5);
 return 0;
}
// 等同于printf("%6.2f\n", 0.5); 

上⾯⽰例中, %*.*f 的两个星号通过 printf的两个参数 6 和 2 传⼊。


输出部分字符串


%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出 的⻓度,其中 [m] 代表⼀个数字,表⽰所要输出的⻓度。

// 输出 hello 
#include <stdio.h>
int main()
{
    printf("%.5s\n", "hello world");
    return 0;
}

上⾯⽰例中,占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符,即“hello”。

返回值


  • 如果打印成功:返回的是在屏幕上打印的字符个数
  • 如果打印失败:返回一个负数


当然一般考虑打印成功情况


请看如下例子:

#include <stdio.h>
int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
    return 0;
}

上⾯的例⼦中,我们就第⼀个printf打印的是第⼆个printf的返回值,第⼆个printf打印的是第三个 printf的返回值。


第三个printf打印43,在屏幕上打印2个字符,再返回2


第⼆个printf打印2,在屏幕上打印1个字符,再放回1


第⼀个printf打印1


所以屏幕上最终打印:4321


【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇):https://developer.aliyun.com/article/1590497?spm=a2c6h.13148508.setting.16.1ee34f0eicv0Dx

目录
相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
229 88
|
1月前
|
C语言
初识C语言:与计算机的交流之输入与输出(scanf和printf)
初识C语言:与计算机的交流之输入与输出(scanf和printf)
167 0
|
2月前
|
存储 C语言 数据格式
【C语言基础考研向】03混合运算和printf讲解
本文分为两部分。第一部分介绍了C语言中的混合运算与类型强制转换的重要性,通过实例展示了当整型数进行除法运算且结果为小数时,必须使用类型转换才能正确存储浮点数结果。第二部分详细讲解了`printf`函数的功能与使用方法,包括格式化输出不同类型数据的基本语法,并通过具体示例演示了如何利用字段宽度和对齐方式来控制输出格式,帮助读者更好地理解和掌握输出格式的控制技巧。
46 10
|
2月前
|
C语言
【C语言基础考研向】05 scanf读取标准输入超详解
本文详细解析了C语言中`scanf`函数的工作原理及常见问题。首先介绍了`scanf`如何处理标准输入,并通过示例说明了为何有时会出现阻塞现象及其解决办法。接着探讨了当输入包含多种数据类型时,特别是字符型数据的处理方式,强调了格式控制的重要性,并给出了正确的输入格式示例。通过正确配置,可以避免因空格和换行符导致的问题,确保数据准确读取。
72 10
|
2月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
2月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
3月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
161 2
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
C语言
c语言中scanf()、printf()函数
  函数调用scanf(“%d”,  &weight) 包含两个参数:“%d” 和&weight。C用逗号来隔开函数调用中的多个参数; 但是printf()和scanf()函数比较特殊,其函数数目可以不受控制。
867 0
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6