目录
一、printf 函数(输出)
1.概念
按一定格式将文本打印在屏幕上
2.基本用法
#include <stdio.h>
int main()
{
printf("hello,c");
return 0;
}
使用peintf()需要引用头文件<stdio.h>
2.1换行符
#include <stdio.h>
int main()
{
printf("hello,c\n");
printf("hello\nc\n");
printf("hello\n");
printf("c\n");
return 0;
}
2.2占位符(这个位置可被其他值代入)
#include <stdio.h>
int main()
{
printf("there are %d apples\n", 3);
printf("%s will come tonight\n", "zs");
printf("%s says it is %d o'clock\n ", "zs", 8);
return 0;
}
注意:占位符第一个字符一律为%,第二个字符表占位符类型 ;一个文本可多个占位符。
2.2.1占位符举例
%c :字符
%d :十进制整数// int
%f:小数(包含float, double类型)//float-- %f double--%lf
%hd:十进制short int 类型
%hu:十进制unsigned short int 类型
%ld:十进制long int 类型
%lu:十进制unsigned long int 类型
%lf:long double 类型浮点数
%p :指针(⽤来打印地址)
%s :字符串
%u :⽆符号整数(unsigned int)
%x :⼗六进制整数
%zd : size_t 类型
3.输出格式
3.1限定宽度
printf ()允许限定占位符的最小宽度
例如:%5d表示这个占位符宽度至少为五
#include <stdio.h>
int main()
{
printf("%5d\n", 123);
return 0;
}
若不满五位,对应值前面会添加空格,输出值默认向右对齐;若希望向左对齐,只需写为%-5d。
对小数:
例如:%12f表输出浮点数最少占据12位
#include <stdio.h>
int main()
{
printf("%12f\n", 3.14);
return 0;
}
由于小数的默认显示精度是小数点后六位,故输出值前有四个空格。
3.2.总是显示正负号
默认下printf(不对正数显示+号,只对负数显示-号。
若想让正数输出+号,可在占位符%加+号。
#include <stdio.h>
int main()
{
printf("%d\n", 3);
printf("%+d\n", 3);
printf("%d\n", -3);
return 0;
}
3.3.限定小数位数
例如:%.2指限定小数后面保留两位
int main()
{
printf("%.3f\n", 1.12);
return 0;
}
小数点后位数不够就在后面加0,位数超出就四舍五入。
联系3.1与3.3既限定宽度又限定小数点后位数
#include <stdio.h>
int main()
{
printf("%12.4f\n", 3.14);
return 0;
}
最小宽度和小数位数可用*代替
#include <stdio.h>
int main()
{
printf("%*.*f\n",12,4,3.14);
return 0;
}
3.4.输出部分字符串
%s表输出字符串,默认全部输出。若要输出开头部分,可用%.ms指定输出的长度,其中m代表一个数字,表所要输出的长度
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello,c");
return 0;
}
二、scanf 函数(输入)
当我们有了变量,需要给变量输入值就可以使用scanf 函数。若需要将变量的值输出在屏幕上的时候,可以使用printf 函数。
注意:在vs中scanf函数不安全,故在使用时需要加入前缀#define_CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 1;
printf("请输入成绩:");
scanf("%d", &a);
printf("你的成绩是%d\n", a);
return 0;
}
1.基本用法
scanf 函数用于读取用户键盘输入。当程序运行到scanf 会停下来,等待用户输入数据,按下回车键后,scanf 就会处理用户输入,将其存入变量。
1. 1语法与printf 类似
scanf("%d",&i);
注:变量前必须加&运算符
因为scanf 传递的是地址,而不是变量。如果这里的变量是字符串,不用加&。
1.2输出多个变量
scanf("%d%d%f%f", &a, &b, &c, &d);
举例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float c = 0.0;
float d = 0.0;
scanf("%d%d%f%f", &a, &b, &c, &d);
printf("%d\n%d\n%f\n%f\n", a, b, c, d);
return 0;
}
注:scanf 处理数值占位符时,会自动过滤空白字符,包括空格,制表符,换行符。故用户输入数据间有空格不影响scanf解读。
另外,用户使用回车键,将输入数据分成几行也不影响解读。
scanf函数处理用户输入的原理:
先将用户输入放入缓存,在等到按下回车键后,按占位符对缓存进行解读。
解读用户输入时,会从上一次解读遗留的第一个字符开始,知道读完缓存或者遇到第一个不符合条件的字符为止。
我们可以看看下面的例子
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
float b = 0.0;
scanf("%d%f", &a, &b);//输入-13.45e12#0
printf("%d\n%f\n", a, b);
return 0;
}
由于a的类型为int,所以scanf函数解读数据中的-13后停下,在解读遗留下来的数据中的第一个字符,由于b的类型为float,故解读数据为0.45e12后停下来,至于为什么停下来,是因为遇到了不符合b的数据类型的字符#
1.3scanf的返回值
scanf的返回值是一个整数,表示成功读取数据的变量的个数。若无读取任何项或匹配失败,则返回0。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int r=scanf("%d%d%d", &a, &b, &c);
printf("r=%d\n", r);//打印返回值
printf("a=%d b=%d c=%d\n", a, b, c);
return 0;
}
如果在成功读取任何数据前发生了读取错误或遇到读取到文件结尾,则返回常量(文件结束标点)EOF(-1)。
按ctrl+z 提前结束输入会返回-1
1.4scanf的占位符
%c:字符
%d:整型
%f:浮点型
%lf:double
%Lf:long double
%s:字符串
%[]:在方框中指定一组匹配的字符,遇到不在集合中的字符就会停止
注:1.除%c以外都会忽略空格字符,%c总是返回第一个字符,无论是否为空格
若要强制性跳过,可写成scanf(" %c",&ch);即在%前加空格,表跳过一个或多个空格。
2.%s不能简单等同于字符串,scanf函数中的%s指从第一个非空白字符开始读起,直到遇到下一个空白字符为止。故无法用来读取多个单词,除非多个%s使用。
scanf 函数将字符串读入字符数组时,不会检测字符串是否超过长度。故储存字符串时可能会超出数组的边界。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char arr[5];
scanf("%s", arr);
printf("%s", arr);
return 0;
}
当我们输入超出长度的字符串,scanf会正常输出字符串并且报错,这就是scanf函数不安全的原因
为了防止这种情况,我们在使用%s时,应指定读入字符串的最长长度,即写成%ms,超出部分会丢弃,就不会有数组溢出的风险。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char arr[5];
scanf("%4s", arr);
printf("%s", arr);
return 0;
}
1.5赋值忽略符
有时用户输入不符合预定格式,为了避免,scanf提供了赋值忽略符,把*加在任何占位符的%后面,该占位符就不会返回值,解析后会被忽略。
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d", year, month, day);
return 0;
}
以上代码用户在使用xxxx-xx-xx才能被读取,若用户输入其他格式如xxxx/xx/xx,就不能被识别,这时使用赋值操作符让其他格式也能被读取。
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d %d %d", year, month, day);
return 0;
}