收集飞花令碎片———C语言输入函数(应声虫)

五一博文连载持续中


scanf函数

前言

scanf 是C语言标准库中的一个输入函数,用于从标准输入(通常是键盘)读取格式化数据。

使用要点

1、变量前必须加& (除了数组名)

int a;
scanf("%d", &a);  // 正确
scanf("%d", a);   // 错误


2、多个输入值

int x, y;
scanf("%d%d", &x, &y);  // 输入时可以用空格/Tab/回车分隔


3、处理输入缓冲区

  • 什么是输入缓冲区?
    输入缓冲区是内存中的一块临时存储区域,用于存放用户从键盘输入的内容。当你键入内容并按回车时,这些内容会先被放入缓冲区,然后程序再从缓冲区读取。读取字符时要注意缓冲区中的换行符
int age;
char ch;
scanf("%d", &age);
scanf(" %c", &ch);  // 注意%c前的空格,用于跳过空白字符


4、返回值

  • 返回成功读取的数据项数
    可用于判断输入是否成功
if(scanf("%d", &num) != 1) {
    printf("输入错误!");
}


5、注意问题

  • 使用%s时要小心缓冲区溢出
    可以指定最大读取长度
char name[20];
scanf("%19s", name);  // 最多读取19个字符,留1个给'\0'
  • scanf 不能直接输出提示信息
scanf("请输入一个数值:%d"&num);//报错

scanf 只用于读取输入,不能像 printf 那样显示提示信息。

应该先用 printf 输出提示,再用 scanf 读取输入。


6、关于VS的scanf的安全性警报问题


先来看下面的一段代码

#include <stdio.h>

int main() {
    int year = 0;
    printf("请输入年份:");  // 提示用户输入
    scanf("%d", &year);    // 读取用户输入

    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        printf("%d是闰年\n", year);
    }
    else {
        printf("%d不是闰年\n", year);  // 补充非闰年的情况
    }

    return 0;
}

代码运行结果如下
在这里插入图片描述

这个错误是Visual Studio 编译器针对scanf()函数的安全警告,是属于比较常见的问题

解决方法(3种方式,任选其一):

  • 方法1:改用 scanf_s(微软推荐)
scanf_s("%d", &year);  // 安全版本,但仅适用于Windows/MSVC

缺点 :scanf_s 不是标准C函数,在其他编译器(如GCC、Clang)可能无法使用。

  • 方法2:禁用这个特定警告(常用方法)
在代码文件 最开头 添加宏定义:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

缺点:这样编译器就不会再提示 scanf 不安全。

  • 方法3:彻底关闭安全警告(不推荐)

在项目属性里设置:
右键项目 → 属性 → C/C++ → 预处理器
在 预处理器定义 中添加:
_CRT_SECURE_NO_WARNINGS
应用并重新编译。


getchar函数

1. getchar() - 读取单个字符

  • 从标准输入读取单个字符
    返回读取的字符(转为int类型),失败返回EOF
char ch = getchar(); // 读取一个字符


2. fgets() - 安全读取字符串

  • 最简单的 fgets 使用模板
#include <stdio.h>

int main() {
    char buffer[100]; // 定义一个足够大的字符数组
    
    printf("请输入内容: ");
    fgets(buffer, sizeof(buffer), stdin); // 读取输入
    
    printf("你输入的是: %s", buffer);
    
    return 0;
}


关键要点:
三个必要参数:
buffer:存储输入的字符数组
sizeof(buffer):最大读取长度(自动计算数组大小)
stdin:表示从标准输入(键盘)读取

自动添加结束符:
fgets 会自动在字符串末尾添加 \0
所以实际读取的字符数 = 指定长度 - 1

推荐实践

读取字符串:优先使用fgets

char name[50];
fgets(name, 50, stdin);

混合输入:结合fgets和sscanf

char buffer[100];
int age;

fgets(buffer, 100, stdin);
scanf(buffer, "%d", &age); // 从字符串解析

逐字符处理:使用getchar或fgetc

while((ch = getchar()) != '\n') {
    // 处理每个字符
}


这些函数比scanf更安全、更可控,特别是在处理用户输入时能避免很多常见问题。








写完这篇文章,小编又要准备躺平平了在这里插入图片描述






如果你觉得这篇文章对你有帮助的话

请给小编一个三连支持一下

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值