首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >收集飞花令碎片———C语言输入函数(应声虫)

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

作者头像
枫亭湖区
发布2025-11-12 18:07:07
发布2025-11-12 18:07:07
110
举报

scanf函数

前言

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

使用要点

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

代码语言:javascript
复制
int a;
scanf("%d", &a);  // 正确
scanf("%d", a);   // 错误

2、多个输入值

代码语言:javascript
复制
int x, y;
scanf("%d%d", &x, &y);  // 输入时可以用空格/Tab/回车分隔

3、处理输入缓冲区

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

4、返回值

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

5、注意问题

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

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

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

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

先来看下面的一段代码

代码语言:javascript
复制
#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(微软推荐)
代码语言:javascript
复制
scanf_s("%d", &year);  // 安全版本,但仅适用于Windows/MSVC

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

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

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

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

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

getchar函数

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

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

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

  • 最简单的 fgets 使用模板
代码语言:javascript
复制
#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

代码语言:javascript
复制
char name[50];
fgets(name, 50, stdin);

混合输入:结合fgets和sscanf

代码语言:javascript
复制
char buffer[100];
int age;

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

逐字符处理:使用getchar或fgetc

代码语言:javascript
复制
while((ch = getchar()) != '\n') {
    // 处理每个字符
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • scanf函数
    • 前言
    • 使用要点
    • 1、变量前必须加& (除了数组名)
    • 2、多个输入值
    • 3、处理输入缓冲区
    • 4、返回值
    • 5、注意问题
    • 6、关于VS的scanf的安全性警报问题
  • getchar函数
    • 1. getchar() - 读取单个字符
    • 2. fgets() - 安全读取字符串
  • 推荐实践
    • 读取字符串:优先使用fgets
    • 混合输入:结合fgets和sscanf
    • 逐字符处理:使用getchar或fgetc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档