「C系列」C 输入/输出

文章目录

  • 一、C 输入 & 输出
    • 1. 输出(Output)
    • 2. 输入(Input)
    • 3. 示例:使用`fgets`读取字符串
  • 二、C 输入/输出-常见问题
    • 1. 缓冲区问题
    • 2. 字符串输入问题
    • 3. 混合输入问题
  • 三、相关链接

一、C 输入 & 输出

在C语言中,输入和输出主要通过标准库函数printfscanf进行。这些函数在stdio.h头文件中定义。

1. 输出(Output)

printf函数用于向标准输出(通常是屏幕)发送格式化的输出。其基本语法如下:

#include <stdio.h>

int main() {
    int num = 10;
    float fnum = 20.5;
    char str[] = "Hello, World!";

    printf("整数: %d\n", num);
    printf("浮点数: %f\n", fnum);
    printf("字符串: %s\n", str);

    return 0;
}

在上面的代码中,%d%f%s是格式说明符,它们告诉printf如何解释后续的参数,并将它们转换为相应的字符串形式。

2. 输入(Input)

scanf函数用于从标准输入(通常是键盘)读取格式化的输入。其基本语法如下:

#include <stdio.h>

int main() {
    int num;
    float fnum;
    char str[50];

    printf("请输入一个整数: ");
    scanf("%d", &num);

    printf("请输入一个浮点数: ");
    scanf("%f", &fnum);

    printf("请输入一个字符串: ");
    scanf("%49s", str); // 注意使用49而不是50,为字符串的结尾符'\0'留空间

    printf("整数: %d\n", num);
    printf("浮点数: %f\n", fnum);
    printf("字符串: %s\n", str);

    return 0;
}

scanf中,&符号用于获取变量的地址,因为scanf需要知道将数据存储在哪里。同样,格式说明符(如%d%f%s)用于告诉scanf如何解释输入的数据。

注意:对于字符串输入,%s格式说明符会读取直到遇到空白字符(如空格、制表符或换行符)为止。因此,如果你输入了一个包含空格的字符串,scanf只会读取到第一个空格为止。如果你需要读取包含空格的字符串,你应该使用其他方法,如fgets函数。

3. 示例:使用fgets读取字符串

#include <stdio.h>

int main() {
    char str[100];

    printf("请输入一个字符串: ");
    fgets(str, sizeof(str), stdin); // 从标准输入读取字符串

    // fgets会读取换行符,所以可能需要手动删除它
    str[strcspn(str, "\n")] = 0; 

    printf("你输入的字符串是: %s\n", str);

    return 0;
}

在这个示例中,fgets函数用于从标准输入(stdin)读取一个字符串,并将其存储在str数组中。注意,我们传递了sizeof(str)作为fgets的第二个参数,以确保不会读取超过数组大小的数据。同时,我们使用strcspn函数来查找换行符的位置,并将其替换为字符串的结尾符(\0)。

二、C 输入/输出-常见问题

在使用C语言进行输入和输出时,确实会遇到一些常见问题。以下是一些常见问题及其详细代码案例:

1. 缓冲区问题

问题:在使用scanf函数时,如果用户输入了多余的数据(比如输入了一个整数后还按下了回车,但是接下来的输入需要另一个字符),那么这些数据会被留在输入缓冲区中,导致下一次scanf读取错误的数据。

解决方案:可以使用fflush(stdin)来清空输入缓冲区,但需要注意的是,fflush(stdin)在C语言标准中是未定义的,其行为可能因编译器和平台而异。更好的做法是使用其他方法来处理这个问题,比如读取并丢弃直到遇到换行符。

代码案例

#include <stdio.h>

int main() {
    int num1, num2;
    char ch;

    printf("请输入一个整数: ");
    scanf("%d", &num1);

    // 尝试清空缓冲区(不推荐使用 fflush(stdin))
    // 更好的做法是直接读取并丢弃直到换行符
    // while ((ch = getchar()) != '\n' && ch != EOF);

    // 假设我们直接输入了另一个整数而没有按回车,那么下面的scanf会读取错误的数据
    printf("请输入另一个整数: ");
    scanf("%d", &num2); // 这里可能会读取到上一个输入遗留的数据

    printf("你输入的两个整数是: %d 和 %d\n", num1, num2);

    return 0;
}

2. 字符串输入问题

问题:使用scanf读取字符串时,如果用户输入的字符串长度超过了为字符数组分配的空间,就会发生缓冲区溢出。

解决方案:使用fgets代替scanf来读取字符串,因为fgets允许你指定读取的最大字符数(包括结尾的空字符)。

代码案例

#include <stdio.h>
#include <string.h>

#define MAX_LENGTH 50

int main() {
    char str[MAX_LENGTH];

    printf("请输入一个字符串: ");
    fgets(str, MAX_LENGTH, stdin); // 读取最多 MAX_LENGTH-1 个字符(为 '\0' 留空间)

    // 去除可能的换行符
    str[strcspn(str, "\n")] = 0;

    printf("你输入的字符串是: %s\n", str);

    return 0;
}

3. 混合输入问题

问题:当你尝试在一个循环中混合使用scanf读取整数和字符时,可能会遇到问题,因为scanf在读取字符时不会跳过空白字符(如空格、制表符或换行符)。

解决方案:在读取字符之前,使用scanf的一个空格控制符来跳过空白字符,或者改用getchar()(配合循环来读取直到非空白字符)来读取字符。

代码案例

#include <stdio.h>

int main() {
    int num;
    char ch;

    printf("请输入一个整数: ");
    scanf("%d", &num);

    // 跳过空白字符
    while ((ch = getchar()) == ' ' || ch == '\t' || ch == '\n');

    // 现在 ch 包含了用户输入的第一个非空白字符
    printf("你输入的非空白字符是: %c\n", ch);

    return 0;
}

或者,使用scanf的空格控制符:

#include <stdio.h>

int main() {
    int num;
    char ch;

    printf("请输入一个整数: ");
    scanf("%d", &num);

    // 使用空格控制符跳过空白字符
    scanf(" %c", &ch); // 注意%c前的空格

    printf("你输入的非空白字符是: %c\n", ch);

    return 0;
}

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组
  14. 「C系列」C enum(枚举)
  15. 「C系列」C 指针及其应用案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/713880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React写一个 Modal组件

吐槽一波 最近公司的项目终于度过了混乱的前期开发&#xff0c;现在开始有了喘息时间可以进行"规范"的处理了。 组件的处理&#xff0c;永远是前端的第一大任务&#xff0c;尤其是在我们的ui库并不怎么可靠的情况下&#xff0c;各个组件的封装都很重要&#xff0c;而…

minium小程序自动化

一、安装minium pip install minium二、新建config.json {"dev_tool_path": "D:\\Program Files (x86)\\Tencent\\微信web开发者工具\\cli.bat","project_path": "小程序项目路径" }三、编写脚本 import miniumclass FirstTest(min…

【Echarts系列】平滑折线面积图

【Echarts系列】平滑折线面积图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 平滑折线面积图如图所示&#xff1a; 数据格式 data [{name: 2020年,value: 150},{name: 2021年,value: 168},{name: 2…

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…

git的ssh安装,windows通过rsa生成密钥认证问题解决

1 windows下载 官网下载可能出现下载太慢的情况&#xff0c;Git官网下载地址为&#xff1a;官网&#xff0c;推荐官网下载&#xff0c;如无法下载&#xff0c;可移步至CSDN&#xff0c;csdn下载地址&#xff1a;https://download.csdn.net/download/m0_46309087/12428308 2 Gi…

【Linux】程序地址空间之动态库的加载

我们先进行一个整体轮廓的了解&#xff0c;随后在深入理解细节。 在动态库加载之前还要说一下程序的加载&#xff0c;因为理解了程序的加载对动态库会有更深的理解。 轮廓&#xff1a; 首先&#xff0c;不管是程序还是动态库刚开始都是在磁盘中的&#xff0c;想要执行对应的可…

PHP在线生成查询产品防伪证书系统源码

源码介绍 PHP在线生成查询产品防伪证书系统源码&#xff0c;源码自带90套授权证书模板&#xff0c;带PSD公章模板&#xff0c;证书PSD源文件。 环境要求&#xff1a;PHPMYSQL&#xff0c;PHP 版本请使用PHP5.1 ~5.3。 图片截图 源码安装说明 1.上传所有文件至你的空间服务器…

学会python——显示进度条(python实例五)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、进度条显示 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

从零到爆款:用ChatGPT写出让人停不下来的短视频文案

一、前言 在自媒体的浪潮中&#xff0c;精彩的短视频文案对内容传播至关重要。众多辅助工具之中&#xff0c;凭借强大的语言处理能力和广泛的应用场景&#xff0c;ChatGPT成为了内容创作者的重要助力。接下来&#xff0c;我将介绍如何借助ChatGPT编写引人入胜的短视频文案&…

积木搭建游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第83讲。 积木搭建游戏&…

Windows10 利用QT搭建SOEM开发环境

文章目录 一. SOEM库简介二. 安装WinPcap三. SOEM(1.4)库安装(1) 编译32位库(2) 编译64位库 四. 运行SOEM示例代码五. WIN10下利用QT构建SOEM开发环境 一. SOEM库简介 SOEM&#xff08;Scalable Open EtherCAT Master 或 Simple Open EtherCAT Master&#xff09;是一个开源的…

【OrangePiKunPengPro】 linux下编译、安装Boa服务器

OrangePiKunPengPro | linux下编译、安装Boa服务器 时间&#xff1a;2024年6月7日21:41:01 1.参考 1.boa- CSDN搜索 2.Boa服务器 | Ubuntu下编译、安装Boa_ubuntu安装boa-CSDN博客 3.i.MX6ULL—ElfBoard Elf1板卡 移植boa服务器的方法 (qq.com) 2.实践 2-1下载代码 [fly752fa…

python将数据保存到文件的多种实现方式

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

EasyRecovery2024数据恢复神器#电脑必备良品

EasyRecovery数据恢复软件&#xff0c;让你的数据重见天日&#xff01; 大家好&#xff01;今天我要给大家种草一个非常实用的软件——EasyRecovery数据恢复软件&#xff01;你是不是也曾经遇到过不小心删除了重要的文件&#xff0c;或者电脑突然崩溃导致数据丢失的尴尬情况呢&…

手机照片免费数据恢复软件EasyRecovery2024免费版下载

大家好&#xff01;今天我要给大家推荐一款非常棒的软件——EasyRecovery。相信大家都知道&#xff0c;电脑中的重要文件一旦丢失&#xff0c;对我们的工作和学习都会产生很大的影响。 而EasyRecovery软件就是专门解决这个问题的利器&#xff01;它能够帮助我们快速、有效地恢…

第三篇—基于黑白样本的webshell检测

本篇为webshell检测的第三篇&#xff0c;主要讲的是基于黑白样本的webshell预测&#xff0c;从样本收集、特征提取、模型训练&#xff0c;最后模型评估这四步&#xff0c;实现一个简单的黑白样本预测模型。   若有误之处&#xff0c;望大佬们指出 Ⅰ 基本实现步骤 样本收集&…

Unity中的伽马(Gamma)空间和线性(Linear)空间

伽马空间定义&#xff1a;通常用于描述图像在存储和显示时的颜色空间。在伽马空间中&#xff0c;图像的保存通常经过伽马转换&#xff0c;使图片看起来更亮。 gamma并不是色彩空间&#xff0c;它其实只是如何对色彩进行采样的一种方式 为什么需要Gamma&#xff1a; 在游戏业…

53. QT插件开发--插件(动态库so)的调用与加载

1. 说明 在使用QT进行插件库的开发之后,还需要将这个插件库程序生成的so动态链接库加载到主程序框架中进行使用,才能达到主程序的模块化开发的效果。在前一篇文章插件创建中介绍了如何在QT中开发插件库,并提供外部接口调用。本篇博客的主要作用是模拟在主程序框架中加载动态…

诊断丢帧:发送端连续帧发送过快,导致接收端丢帧

项目场景: 在项目开发过程中,对于报文的接收/发送,一般来说,通信量大,选择Polling(轮询)处理模式;通信量小,选择Interrupt(中断)处理模式。具体选择没有优劣之分。结合项目的实际情况,选择适合项目的方式就好。小编将分享一个Polling模式下出现的丢帧现象。 1576…

Docker镜像技术剖析

目录 1、概述1.1 什么是镜像&#xff1f;1.2 联合文件系统UnionFS1.3 bootfs和rootfs1.4 镜像结构1.5 镜像的主要技术特点1.5.1 镜像分层技术1.5.2 写时复制(copy-on-write)策略1.5.3 内容寻址存储(content-addressable storage)机制1.5.4 联合挂载(union mount)技术 2.机制原理…