当前位置: 首页 > article >正文

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;
}

scanf
如果输入2个数后,按 ctrl+z ,提前结束输入:
error
如果一个数字都不输入,直接按3次 ctrl+z ,输出的 r 是-1,也就是EOF 。
error

二、通过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;
}

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\n",year, month, day);

    return 0}

如果用户输入2020-12-12,就会正确解读数据,但是如果输入2020/12/12,scanf()就会解析数据失败。

scanf()提供了一个赋值忽略符,只要把*夹在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
dc1
dc2

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;
}

pass


http://www.kler.cn/a/385165.html

相关文章:

  • 牛客小白月赛104(未补)
  • vue+websocket实现即时聊天平台
  • 软件设计师-上午题-15 计算机网络(5分)
  • 基于IM场景下的Wasm初探:提升Web应用性能|得物技术
  • SpringBoot项目集成ONLYOFFICE
  • 【LeetCode】【算法】287. 寻找重复数
  • 使用 Mac 数据恢复从 iPhoto 图库中恢复照片
  • 优雅的使用TypeScript的建议
  • QT项目之推箱子
  • Windows下mysql数据库备份策略
  • NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
  • fastGPT调用stable diffusion生成图片,本地模型使用ollama
  • DNS域名详细解析详解
  • 让零售更智能|无人超市系统开发,实现数字化商超
  • 【安当产品应用案例100集】029-使用安全芯片保护设备核心业务逻辑
  • _处理匿名命名空间里的变量时进入硬件中断错误
  • [全网最完整最详细C++篇]第四篇:类和对象(上)
  • YOLOv6-4.0部分代码阅读笔记-figure_iou.py
  • LabVIEW高效数据采集与信号处理系统
  • 【UE5】在材质中实现球形法线技术,常用于改善植物等表面的渲染效果
  • STM32CUBEIDE FreeRTOS操作教程(八):queues多队列
  • Altium Designer使用技巧(四)
  • 3193. 统计逆序对的数目
  • [JAVAEE] 网络基础
  • 气象监测软件的程序设计
  • 富格林:安全步骤交易稳健出金