免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

C语言:printf和scanf函数

C语言:printf和scanf函数 文章目录前言本文旨在系统性地介绍C语言中的printf和scanf函数。一、printf1.1、基本功能1.2、占位符1.3、占位符举例1.4、输出格式1.5、printf的返回值1.6、printfp二、scanf2.1、基本用法2.2、scanf的返回值2.3、占位符2.4、赋值忽略符前言本文旨在系统性地介绍C语言中的printf和scanf函数。一、printf1.1、基本功能printf 用于格式化输出格式化输出就是通过 printf 占位符控制输出格式必须包含 stdio.h。代码示例#includestdio.hintmain(){// 不换行光标停留在输出末尾printf(Hello World);// 输出: Hello World// 换行光标移到下一行开头printf(Hello\nWorld\n);// 输出:// Hello// Worldreturn0;}1.2、占位符printf 的第一个参数是格式字符串格式字符串是一个包含普通字符和格式占位符的字符串它决定了输出的文本结构和占位符位置后续参数依次替换占位符。参数总数 占位符个数 1。格式以 % 开头 类型字母如 %d、%s。作用在输出文本中预留位置运行时替换为具体值。代码示例#includestdio.hintmain(){printf(姓名%s年龄%d成绩%.1f\n,王五,20,95.5);// 输出姓名王五年龄20成绩95.5return0;}1.3、占位符举例printf() 的占位符有许多种类与 C 语言的数据类型相对应。列举常用常用占位符占位符类型说明%d / %iint / signed int十进制整数%cchar单个字符%schar*字符串%ffloat / double十进制小数%lfdouble十进制小数%p指针内存地址%%—输出百分号 %%uunsigned int十进制无符号整数%ldlong int十进制长整型%luunsigned long int十进制无符号长整型%lldlong long int十进制长长整型%lluunsigned long long int十进制无符号长长整型%zusize_tsizeof 返回值类型%x/%X整型十六进制整数小写/大写%o整型八进制整数1.4、输出格式printf() 可以定制占位符的输出格式。最小宽度 %nd左对齐 %-nd补零 %0nd显示正负号 %d固定小数位数 %.nf宽度 小数位数 %m.nf动态宽度/精度 %*.*f输出部分字符串 %.ns#includestdio.hintmain(){//最小宽度printf(%5d\n,123);// 123printf(%-5d\n,123);// 123printf(%05d\n,123);// 00123//显示正负号printf(%d\n,12);// 12printf(%d\n,-12);// -12//小数位数printf(%.2f\n,0.5);// 0.50printf(%.3f\n,0.5);// 0.500//宽度 小数位数printf(%6.2f\n,0.5);// 0.50宽度62位小数//动态宽度和精度用 * 代替printf(%*.*f\n,6,2,0.5);// 0.50,等价于 printf(%6.2f\n, 0.5);//输出部分字符串printf(%.5s\n,hello world);// helloreturn0;}1.5、printf的返回值printf 的返回值 成功输出的字节数。它在输出前已经根据格式符将数据“翻译”成字符序列整型变字符串、字符串不变然后统计这个字符序列的字节长度。和原始数据的内存大小无关。1.6、printfpprintf 的第一个参数是格式字符串用于控制输出格式。printf( p ) 将指针 p 指向的字符串作为格式字符串传递给 printf。代码示例char*pHello World;printf(p);// 等价于 printf(Hello World);格式字符串漏洞如果 p 中包含 % 格式说明符printf 会去栈上读取对应数量的参数导致未定义行为。代码示例char*p%s%s%s%s%s%s%s%s%s%s;printf(p);// 危险,可能导致程序崩溃或信息泄露二、scanf2.1、基本用法功能从键盘读取用户输入执行流程程序暂停 → 等待输入 → 按回车 → 处理输入 → 存入变量头文件#include stdio.h代码示例#includestdio.hintmain(){intage;// 程序运行到这里会暂停等待用户输入printf(请输入你的年龄);scanf(%d,age);// 用户输入数字按回车存入 ageprintf(你的年龄是%d\n,age);return0;}第一个参数是一个格式字符串格式字符串是一个包含普通字符和格式占位符的字符串告诉编译器如何解读用户的输入需要提取的数据是什么类型。其余参数就是存放用户输入的变量格式字符串里面有多少个占位符就有多少个变量。变量前面必须加上 运算符因为 scanf() 传递的不是值而是地址即将变量的地址指向用户输入的值。如果是指针变量比如字符串变量那就不用加 运算符。①对于数值占位符%d、%f 等scanf 会自动跳过空格、制表符、换行符等空白字符因此输入可以跨越多行。②输入先进入缓冲区按回车后 scanf 才按照占位符开始解读。③解读输⼊时会从上一次解读遗留的第一个字符开始直到读完缓存或者遇到第⼀个不符合条件的字符为止。代码示例#includestdio.hintmain(){inti,j;floatx,y;// 用户输入可以在一行也可以跨多行// 输入1 -20 3.4 -4.0e3// 或// 1// -20// 3.4// -4.0e3scanf(%d%d%f%f,i,j,x,y);printf(i %d\n,i);// 1printf(j %d\n,j);// -20printf(x %f\n,x);// 3.4printf(y %f\n,y);// -4.0e3return0;}①%d 等占位符会自动跳过输入开头的空格。②按占位符规则读取%d 读取整数遇到非数字如 .停止%f 读取浮点数遇到非数字如 #停止。③每次 scanf 调用都会从上一次停止的位置继续读取。④多个占位符可以合并到一个格式字符串中按顺序依次读取。代码示例#includestdio.hintmain(){intx;floaty;// 用户输入 -13.45e12# 0//分两次调用scanf(%d,x);// 跳过空格读取 -13遇到 . 停止printf(%d\n,x);// -13scanf(%f,y);// 从 . 继续读取 .45e12遇到 # 停止printf(%f\n,y);// 0.45e12 或 450000000000//合并为一次调用等效// scanf(%d%f, x, y); // 同样%d 读 -13%f 读 .45e12return0;}2.2、scanf的返回值scanf 返回成功读取的变量个数正数没有读取任何项或匹配失败返回 0文件结束或读取错误返回 常量EOF-1。EOFend of file 文件结束标志。代码示例#includestdio.hintmain(){inta0;intb0;while(scanf(%d %d,a,b)2)//代码要求是多组数据输⼊,或scanf(%d %d, a, b)! EOF{intcab;printf(%d\n,c);}return0;}2.3、占位符常用占位符%c char 读取单个字符不跳过空白%d int 读取十进制整数%f loat 读取单精度浮点数%lf double 读取双精度浮点数%Lf long double 读取长双精度浮点数%s char[] 读取字符串跳过空白遇到空白停止%[] char[] 读取匹配集合中的字符如%[0-9]注①如果要强制跳过字符前的空白字符可以写成 scanf( %c, ch) 即 %c 前加上⼀个空格表示跳过零个或多个空白字符。②scanf 读取字符串时自动在末尾添加 \0且不会检查数组边界。使用 %ns如 %10s限制最大读取长度确保数组大小至少为 n1防止缓冲区溢出。代码示例#includestdio.hintmain(){charch;intnum;floatf;doubled;charstr[20];// %c读取单个字符不跳过空格printf(请输入一个字符);scanf(%c,ch);// 输入A → ch A// %d读取整数printf(请输入一个整数);scanf(%d,num);//%f读取 floatprintf(请输入一个浮点数float);scanf(%f,f);//%lf读取 doubleprintf(请输入一个浮点数double);scanf(%lf,d);//%s读取字符串printf(请输入一个字符串);scanf(%s,str);// 输入Hello World → 只读取 Hellocharname[11];scanf(%10s,name);//表示最多读取⽤户输⼊的10个字符后面的字符将被丢弃//%[0-9]只读取数字printf(请输入数字);scanf(%[0-9],str);// 输入123abc → 读取 123return0;}2.4、赋值忽略符赋值忽略符 * 让 scanf 跳过匹配的输入项不存入任何变量。常用于跳过输入中的分隔符如日期中的 / 或 -使格式字符串更灵活。代码示例#includestdio.hintmain(){inta,b;charstr[20];// %*d跳过第一个整数读取第二个// 输入100 200scanf(%*d%d,a);// 跳过 100读取 200 到 aprintf(a %d\n,a);// 200//%*s跳过字符串读取整数// 输入Hello 123scanf(%*s%d,a);// 跳过 Hello读取 123 到 aprintf(a %d\n,a);// 123//跳过多个不同类型// 输入张三 18 95.5scanf(%*s%d%*f,a);// 跳过 张三读取 18 到 a跳过 95.5printf(a %d\n,a);// 18//跳过日期中的分隔符// 输入2026-08-02scanf(%d%*c%d%*c%d,a,b,a);// 跳过 - 和 -// 但注意这里用了同一个变量 a实际应分别存储return0;}
返回列表