scanf与printf用法精解

1.printf

1.1基本介绍

printf即为:print format 以规定格式打印
printf不会在行尾添加换行符,想要换行必须手动加\n

#include<stdio.h>
int main()
{
printf("hello,\n world")//换行符可以加在文本中间,运行结果为:
//hello,
//world
}

1.2占位符

printf()可以在输出文本中指定占位符
所谓占位符就是这个位置可以被其他值代入

#include<stdio.h>
int main()
{
printf("%s said she will come at %d pm tonight",Lisa,9)
return 0;
}

注意:占位符的顺序与要带入参数的顺序是一一对应的,不能乱
printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。

常见占位符:(就列几个常见常用的)
%c:输出字符
%d:输出十进制整数
%s:输出字符串
%f:输出float型浮点数
%lf:输出double型浮点数
%p:输出指针
%u:输出unsigned int 型整数
%zd:size_t类型
%%:输出%

1.3限定输出宽度

printf中允许限定占位符的最小宽度

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

这里%5d表示输出结果至少占5个字符,123只有3个字符,所以输出时前面加两个空格,注意此时补足字符位数默认遵循左对齐
那想让它右对齐怎么办?

#include<stdio.h>
int main()
{
printf("%-5d",123);//改成%-5d  输出结果为“123  ”
return 0;
}

1.4显示正负号

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

1.5限定小数位数

#include<stdio.h>
int main()
{
  printf("%.2f"1.25);
  return 0;
  }

%.2f 表示:输出一个float类型的小数,保留小数点后两位
我们知道,float类型默认精确到小数点后6位,正常输出1.250000
现在在这个程序里,就会输出 1.25

再来

#include<stdio.h>
int main()
{
  printf("%7.2f"1.25);//输出为“   1.25”
  return 0;
  }

所以,最小字符位数和小数点保留位数可以一起限定

再来种形式

#include<stdio.h>
int main()
{
  printf("%*.*f"621.25;//等同于%6.2f 输出为“   1.25”
  return 0;
  }

1.6限定字符长度

#include<stdio.h>
int main()
{
   printf("%.5s","hello,wrld");//表示最多输出5个字符
   return 0;
   }//运行结果为 hello

2.scanf

2.1基本介绍

scanf用于读取用户的键盘输入
当程序运行到scanf时,会停下来等用户输入
输入完后,将输入内容存储进变量

int a=1;
scanf("%d",&a);

此代码中,%d表示要读取一个整数,&a 表示读取了输入后存进变量a

注意:变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。

另外,scanf在处理占位符时,会自动过滤掉空白符,如:空格,制表符,换行符等
所以,用户在输入的时候较自由,请看:

scanf("%d%d%f%f",&a,&b,&c,&d)

可以输入:
1234

12 34

1
2 34
都没问题

下一个
scanf解读用户输入时,会在上一个解读完毕后遗留的第一个字符开始再进行解读,比如:

#include<stdio.h>
int main()
{
   int a=0;
   float b=0.0;
   scanf("%d",&a);
   scanf("%f",&b);
   printf("%f  %d",b,a);
   return 0;
   }
   //假如用户输入: -13.45e6#0

第一个scanf从-开始读,读完-13,读到小数点停止,下一个scanf从小数点开始读,读完.45e6读到#停止 这里,e6是科学计数法,表示乘10的6次方
所以程序运行结果是:
-13 450000.000000

2.2scanf的返回值

scanf()的返回值是整数,表示读取数据的数量
如果没有读取任何项,或者读取失败,返回值是0
如果读取任何文件之前,发生读取错误或者读取到文章结尾,则返回常量
EOF(-1)
在这里插入图片描述
在这里插入图片描述

如果读两个数,第三个数不让读了(在VS环境中按3次 ctrl+z ,结束输⼊)

在这里插入图片描述
如果一开始三个数全不让读了
在这里插入图片描述

2.3赋值忽略符

注意 刚才说到,scanf()在读取输入的时候会忽略*空白符,如:空格,制表符,换行符等** 但仅是空白符

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d-%d-%d", &year, &month, &day);
 return 0;
 }

这就限制住了输入格式必须是如:2023-7-23
如果输入成2023/7/23则不能读取
如何删去输入格式限制呢?

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d%*c%d%*c%d", &year, &month, &day);
 return 0;

这样,不管是2023-7-23还是2023/7/23都能读取
输出形式都是 2023 7 23
这里,将*加在占位符的%后面,就如%*c 该占位符被解析后就会被丢弃
上面代码中%*c 表示舍弃夹在输入的两个数值中间的字符

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值