关于scanf和printf

本文介绍了C语言中的printf和scanf函数,包括占位符的使用,如%d,%c,%s等,以及格式化输出的控制,如最小宽度、小数位数等。还提到了scanf函数如何处理键盘输入,过滤空白字符,以及处理错误输入的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、printf【头文件<stdio.h>】

占位符

在要打印的文本中占据一个位置,可以用其他值替换
如:

#include<stdio.h>
int main()
{
   printf("%s will come %d o'clock.", "张三", 12);
   return 0;
   }

输出结果是: 张三 will come 12 o’clock.

参数与占位符为一一对应关系,不能打乱顺序。如果参数个数小于占位符的数量,输出结果可能是内存中的任意值。

一些占位符的列举:
  • %d:十进制整数
  • %c:字符
  • %s:字符串
  • %f:单精度浮点数
  • %lf:双精度浮点数
  • %a:十六进制浮点数,字母输出为小写
  • %A:同上,但字母输出为大写
  • %e:科学计数法,e为小写,如3e3=3*10^3
  • %E:同上,但E为大写
  • %i:整数,基本等同于%d
  • %o:八进制整数
  • %x:十六进制整数
  • %p:指针
  • %u:无符号整数
  • %%:一个单纯的百分号
  • %n:已输出的字符串数量(本⾝不输出,只将值存储在指定变量之中)
  • %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e 为⼩写。
  • %G :等同于 %g ,不过指数部分E为大写

对输出内容的限定

最小宽度
#include<stdio.h>

int main()
{  printf("%12f",100);
   return 0;
   }

以上输出的结果为“ 100.000000“,数字前面有俩空格,因为默认小数点后保留六位,且限定的宽度为12,那么打印的结果就有12位
如果想要空格加在右边,在12前加一个-
变成printf("%-12f",100);即可
(超过了最小宽度就是照常全部输出)

显示正号
#include<stdio.h>

int main()
{
   printf("%+d",100);
   return 0;
   }

在%后面加上+,输出的结果就会带上符号,此时输出的是+100

小数位数
#include <stdio.h>

int main()
{
   printf("%.2f",3);
   return 0;
   }

此时f前的.2用来限制保留两位小数,输出结果为3.0

可与限制宽度的写法结合

#include<stdio.h>

int main()
{
   printf("%12.5f",3);
   return 0;
   }

输出的结果为3.00000,前面有5个空格

最小宽度和小数位数这两个限定参数可以用*代替

#include<stdio.h>

int main()
{
   printf("*.*f",12,5,3);
   return 0
   }

和上面结果是一样的

输出部分字符串
#include<stdio.h>

int main()
{
   printf("%.5s","hello world");
   return 0;
   }

以上输出结果只有一个hello,因为前面的.5限制了它只能输出5个字符
(一个汉字算两个字符)

scanf【头文件<stdio.h>】

scanf函数表示读取在键盘上输入的内容
在这里插入图片描述
当程序运行到scanf函数时,会停下来等待用户输入,用户存入数据后,scanf函数将其存入变量

#include<stdio.h>

int main()
{
   int a=0;
   int b=0;
   int m=scanf("%d %d",&a,&b);//注意变量一定要取地址!!!
   printf("%d\n",a+b);
   printf("%d\n",m);
   return 0;
   }

输入1 2,代码的运行结果是3 2
此时m为scanf函数的返回值,也就是scanf函数成功读到的变量个数
如果跳过读取数值的过程(按ctrl+Z),那么返回值就是常数EOF,也就是-1
在这里插入图片描述

  • scanf函数处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等
    所以无论输入的两个变量之间有多少个空格,或是回车都不会影响读取
  • scanf函数在读到不符合格式的数据时会终止读数,继续下一个数据的读取
#include<stdio.h>

int main()
{
    int x;
    float y;
    scanf("%d", &x);
    scanf("%f", &y);

   return 0
   }

此处若输入-13.45e12# 0
读到的x为-13,y为0.45*10^12

占位符

与printf的基本一致

  • %[]:在方括号中指定一组匹配的字符(如[0~9]),遇到不在集合中的字符,匹配将会停止

  • 这些占位符读取时都会跳过开头的空格,%c除外【 %c(%前面加一个空格)可以强制跳过开头的空格】

  • %s读取时是从第一个非空白字符开始,一直读到一个空白字符结束,不会包含空白字符,所以不方便用它表示多个单词(除非多个%s连用)

  • 占位符为%s时,会在字符串后面多加一个\0

字符串长度

scanf函数不会检测字符串是否超出了数组长度,为了防止超出,应该指定读入字符串的最大长度,后面的字符将被丢弃。

#include<stdio.h>

int main()
{
   char A[11];
   scanf("%10s",A);//变量要取地址,数组名和指针无需
   return 0;
   }
赋值忽略符
#include<stdio.h>

int main()
{
   int a=0;
   int b=0;
   int c=0;
   scanf("%d-%d-%d",&a,&b,&c);
   printf("%d-%d-%d\n",a,b,c);
   return 0;
   }

如果输入1/2/3,代码就无法运行
此时只要把*加在任意占位符的%后面就可以让系统自动忽略这个符号

scanf("%d%*c%d%*c%d",&a,&b,&c);

这样无论是1/2/3还是1-2-3都可以运行下去

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值