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",6,2,1.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 表示舍弃夹在输入的两个数值中间的字符