c语言-scanf/scanf_s函数的用法
文章目录
- 一、scanf是什么?
- 二、通过scanf进行赋值
- scanf 输入一段带空格的句子, %[^\n] 格式字符串。
- 三、赋值忽略符
- scanf_s()详细介绍
- 计算器程序实例
一、scanf是什么?
函数原型:int scanf ( const char * format, … );
scanf是一个格式输出库函数,因为它是库函数所以它有一个头文件,这个头文件是 <stdio.h>,在使用时一定要引用这个头文件。
scanf函数是一个输入函数,所以接收的参数类型需要满足一定的格式
输入的格式有:各种字符,如字符串,单字符和数字等
scanf从缓冲区读取数据,每次读取一个数据,如果缓冲区中无内容,则出现堵塞,在运行窗口要求用户输入;
scanf(“%d%d”, &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF(-1)。
且返回值为int型
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int r=scanf("%d %d %f",&a, &b, &f);
printf("a=%d b=%d f=%f",a, b, f);
printf("r = %d\n", r);
return 0;
}
如果输入2个数后,按 ctrl+z ,提前结束输入:
如果一个数字都不输入,直接按3次 ctrl+z ,输出的 r 是-1,也就是EOF 。
二、通过scanf进行赋值
指定输入数据所占列宽
scanf(“%3d%3d”,&a,&b)
输入:123456系统自动将123赋给a,456赋给b
%后面加‘ * ’用来抑制输入。
scanf(“%2d%*3d%2d”,&a,&b)
输入:1234567。将12赋给a,67赋给b。个数据”345”被跳过不赋给任何变量。
输入数据流分隔。根据格式字符的含义从输入流中取得数据,当输入流中数据类型与格式字符要求不符时,就认为这一项结束。
如:scanf(“%d%c,%d”,&a,&b,&c);
如果输入如下信息:12r12则scanf函数在接收数据时发现”r”类型不匹配,于是把12赋值给a,把”r”赋给变量b,最后把12赋给c。
隐示分隔符。空格、制表符’\t’,换行符/回车键’\n’都是C语言认定的数据分隔符。
scanf 输入一段带空格的句子, %[^\n] 格式字符串。
这将允许 scanf 读取输入,直到遇到换行符为止,从而允许输入包含空格的句子。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
char sentence[100];
printf("请输入一段带空格的句子:\n");
scanf(" %[^\n]", sentence);
printf("输入的句子是:%s\n", sentence);
return 0;
}
三、赋值忽略符
#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\n",year, month, day);
return 0;
}
如果用户输入2020-12-12,就会正确解读数据,但是如果输入2020/12/12,scanf()就会解析数据失败。
scanf()提供了一个赋值忽略符,只要把*夹在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
scanf_s()详细介绍
scanf_s()函数则是C11标准引入的新函数,相较于老版的scanf()函数,它更加安全可靠,避免了一些潜在的安全隐患。
需要指定最大读入的字符数,也就是我们经常听说的“缓冲区边界”
scanf_s(“%c”, &c, 1);
这里的%c表示要输入的是一个字符,&c是字符变量c的地址,1表示要读入一个长度为1的字符。
计算器程序实例
#include <stdio.h>
#include <stdlib.h>
int add(int item1, int item2);
int sub(int item1, int item2);
int mult(int item1, int item2);
int divide(int item1, int item2);
int add(int item1, int item2)
{
return item1 + item2;
}
int sub(int item1, int item2)
{
return item1 - item2;
}
int mult(int item1, int item2)
{
return item1 * item2;
}
int divide(int item1, int item2)
{
return item1 / item2;//不考虑除数为0
}
int main()
{
int item1=8, item2=2;
char op='*';
int result;
//*:42,0
//+:43,1
//-:45,2
///:47,5
int (*pf[6])(int, int) = { mult,add,NULL,sub,NULL,divide };
scanf_s("%d %c %d", &item1, &op, 1,&item2);
result = pf[op - '*'](item1, item2);
printf("%d %c %d = %d.\n", item1, op, item2, result);
return 0;
}