关于scanf和printf

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

一、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都可以运行下去

在C语言中,`scanf` `printf` 是两个常用的输入输出函数,它们分别用于从标准输入读取数据向标准输出写入数据。尽管它们在功能上看似对立,但在使用方式、格式化处理应用场景上存在显著差异。 ### 功能区别 `printf` 函数用于将格式化的数据输出到标准输出(通常是终端或控制台),而 `scanf` 函数用于从标准输入(通常是键盘)读取格式化的数据。`printf` 通过格式字符串控制输出内容,例如 `printf("Hello, World!\n");` 会输出指定的字符串并换行。相对地,`scanf` 会等待用户输入,并根据指定的格式解析输入的数据,例如 `scanf("%d", &num);` 会读取一个整数并存储到变量 `num` 中 [^4]。 ### 格式化处理 `printf` `scanf` 都支持格式化字符串,但它们的处理方式不同。`printf` 使用格式字符串来决定如何显示数据,例如 `%d` 表示整数,`%f` 表示浮点数,`%s` 表示字符串等。它不需要变量地址,直接使用变量值进行输出。`scanf` 同样使用格式字符串来解析输入数据,但它的参数列表需要提供变量的地址,以便将解析后的数据存储到正确的内存位置。例如,`scanf("%d%d", &a, &b);` 中的 `&a` `&b` 分别表示变量 `a` `b` 的地址 [^3]。 ### 输入输出方向 `printf` 是输出函数,负责将数据发送到标准输出,而 `scanf` 是输入函数,负责从标准输入读取数据。`printf` 的输出目标通常是终端,但也可以通过 `fprintf` 扩展到文件或网络流。同样,`scanf` 通常用于从键盘读取数据,但可以通过 `fscanf` 从文件或网络流中读取数据 [^4]。 ### 使用注意事项 `scanf` 在输入时要求格式严格,用户输入的格式必须与格式字符串匹配,否则可能导致解析错误。此外,`scanf` 不会在输入结束后自动添加换行符,因此需要注意输入缓冲区的处理。相比之下,`printf` 的输出格式较为灵活,只要格式字符串正确,输出结果通常符合预期 [^3]。 ### 示例代码 以下是一个简单的示例,演示了 `scanf` `printf` 的基本用法: ```c #include <stdio.h> int main() { int num; printf("请输入一个整数:"); // 输出提示信息 scanf("%d", &num); // 从标准输入读取一个整数 printf("你输入的整数是:%d\n", num); // 输出读取的整数 return 0; } ``` 在此示例中,`printf` 用于输出提示信息,`scanf` 用于读取用户输入的整数,并通过 `printf` 输出读取的值 [^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值