C语言中的基本输入输出

2023-11-19

目录

1.字符输出函数putchar

2.字符输入函数getchar

3.格式化输出函数printf

4.格式化输入函数scanf

5.字符串接收函数gets

6.字符串接收函数fgets

7.字符串输出函数puts

8.格式化转换为字符串函数sprintf

9.格式化转换为指定长度字符串函数snprintf

10.字符串转换为格式化函数sscanf

注意:


1.字符输出函数putchar

putchar 函数用于将单个字符输出到标准输出设备(通常是控制台)。它的原型如下:

int putchar(int ch);

该函数将字符 ch 输出到标准输出,并返回该字符。如果成功,则返回一个字符的ASC码;如果出错,则返回 EOF即-1。

2.字符输入函数getchar

 getchar 函数用于从标准输入设备(通常是键盘)读取单个字符。它的原型如下:

int getchar(void);

 该函数从标准输入读取一个字符,并返回该字符。如果成功,则返回对应字符的ASCII码;如果到达文件尾或遇到错误,则返回 EOF即-1。

3.格式化输出函数printf

printf函数叫做格式输出函数,其功能是按照用户指定的格式,把指定的数据输出到屏幕上,printf函数的格式为:

printf("格式控制字符串",输出表项);

常用的输出格式及含义如下:

格式字符
d , i 以十进制形式输出有符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀0)
x 以十六进制形式输出无符号整数(不输出前缀0x)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度类型实数
e 以指数形式输出单、双精度实数
g 以%f或%e中较短输出宽度的一种格式输出单、双精度实数
c 输出单个字符
s 输出字符串

4.格式化输入函数scanf

 scanf函数称为格式输入函数,即按照格式字符串的格式,从键盘上把数据输入到指定的变量之中。scanf函数的调用的一般形式为:

scanf("格式控制字符串",输入项地址列表);

 scanf函数中格式字符串的构成与printf函数基本相同,但使用时有几点不同。
(1)格式说明符中,可以指定数据的宽度,但不能指定数据的精度。例:

float a;
scanf(“%10f”,&a);  //正确
scanf(“%10.2f”,&a);  //错误

(2)输入long类型数据时必须使用%ld,输入double数据必须使用%lf或%le。
(3)附加格式说明符“*”使对应的输入数据不赋给相应的变量。

scanf()函数所用的转换说明符与printf()所用的几乎完全相同。主要区别在于printf()把%f、%e、%E、%g、%G同时用于float类型和double类型,而scanf()只是把他们用于float类型,而用于double类型时要求使用l(字母l)修饰符。

转换说明符
%c 把输入解释成一个字符
%d 把输入解释成一个有符号十进制整数
%e,%f,%g,%a 把输入解释成一个浮点数(%a是C99的标准)
%E,%F,%G,%A 把输入解释成一个浮点数(%A是C99的标准)
%i 把输入解释成一个有符号十进制整数
%o 把输入解释成一个有符号的八进制整数
%p 把输入解释成一个指针(一个地址)
%s 把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u 把输入解释成一个无符号十进制整数
%x,%X 把输入解释称一个有符号十六进制整数

*修饰符在scanf中()的用法:

*在scanf()中提供截然不同的服务,当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目。请参考程序事例:

/*用*跳过scanf接收的数字*/
#include<stdio.h>
int main(void)
{
    int num;
    printf("请输入:\n");
    scanf_s("%*d %*d %d",&num);
    printf("我得到了%d\n",num);
    return 0;
}

运行结果:

请输入:
2000 1000 3000
我得到了3000

5.字符串接收函数gets

在C语言中,除了用scanf,以%s接收字符串之外,还可以使用gets函数更方便的接收字符串。其函数原型如下:

char *gets(char *str);

可以用gets直接往字符数组里接收字符串,我们通过观察函数原型,可以看到在gets中传入一个字符指针,也就是存放这个字符串的字符数组地址即可接收,需要主要的是,要保证能存的下。需要注意的是gets不会检查输入的字符串长度,即可能超出字符串数组的长度造成内存溢出,这其实也是gets函数不安全的原因,其已经在不少OJ中不允许使用。

示例代码:

# include <stdio.h>
int main(void)
{
    char str[100] = "\0";  
    printf("请输入字符串:\n");
    gets(str);
    printf("刚才输入的字符串是:\n");
    printf("%s\n", str);
    return 0;
}

当我们运行程序后,直接在程序中输入字符串,如 帅哥 则程序输出:

请输入字符串:
刚才输入的字符串是:
帅哥

6.字符串接收函数fgets

gets 函数用于从标准输入读取一行字符串(包括空格),并将其存储到指定的字符数组中。它已被弃用,不推荐使用,因为它容易导致缓冲区溢出。推荐使用更安全的 fgets 函数替代。

fgets 函数是 C 语言中用于从文件或标准输入流读取字符串的函数。它的函数原型如下:

char *fgets(char *str, int size, FILE *stream);

该函数从指定的流(stream)中读取最多 size - 1 个字符(包括换行符 \n 和空字符 \0),并将其存储到字符串 str 中。读取操作会一直进行,直到遇到换行符、文件结束符或达到最大字符数目限制。fgets 函数的返回值是一个指向字符串 str 的指针,如果读取成功,它会指向 str 的起始地址。如果发生错误或到达文件末尾,则返回 NULL。

以下是使用 fgets 函数读取用户输入的示例代码:

#include <stdio.h>
int main() {
    char input[50];
    printf("输入: ");
    fgets(input, sizeof(input), stdin);
    printf("输出: %s", input);
    return 0;
}

 上述程序中,我们定义了一个字符数组 input 来存储用户输入的字符串。使用 fgets 函数来读取用户输入,并将其存储在 input 中。sizeof(input) 表示 input 数组的大小,即最大可接受的字符串长度。stdin 表示标准输入流,也可以替换为其他文件流。

7.字符串输出函数puts

puts函数用于将字符串输出到标准输出设备,并自动追加换行符。它的原型如下:

int puts(const char* str);

该函数将字符串 str 输出到标准输出,并在末尾自动追加换行符。如果成功,则返回非负值;如果出错,则返回 EOF。puts比printf函数方便得多,不需要指定字符串类型,而且末尾不用加换行符会自动换行,对于单独字符串的使用,确实方便很多。

以下是使用puts函数读取用户输入的然后输出示例代码:

#include <stdio.h>
int main(void)
{
    char str[100]="帅哥";
    printf("%s\n",str);  
    puts(str);  
    return 0;
}

 运行结果:

帅哥
帅哥

8.格式化转换为字符串函数sprintf

sprintf()函数是一个C语言标准库函数,用于将格式化的数据写入字符串中。

sprintf()函数的使用方法如下:

int sprintf(char *str, const char *format, ...);

其中,str是接收格式化数据的目标字符串的指针;format是格式字符串,指定了要写入字符串的数据类型和格式;...是一系列要插入到格式字符串中的参数。

例如,如果我们有两个整数变量num1num2,我们可以将它们转换为字符串并存储在目标字符串output中,如下所示:

#include <stdio.h>

int main() {
    int num1 = 10;
    int num2 = 20;
    char output[50];

    sprintf_s(output, "num1: %d, num2: %d", num1, num2);

    printf("输出结果:%s\n", output);


    return 0;
}

 运行结果:

num1: 10, num2: 20

注意:

在使用sprintf()函数时,请确保目标字符串足够大,以容纳格式化后的数据,以防止缓冲区溢出。

9.格式化转换为指定长度字符串函数snprintf

snprintf()函数用于将格式化的数据写入一个指定长度的字符串(缓冲区)中。它的原型如下:

int snprintf(char *str, size_t size, const char *format, ...);

参数解释:

  • str:目标字符串的指针,用于存储格式化后的数据。
  • size:目标字符串的最大字符数(包括结尾的空字符)。
  • format:格式化字符串,指定了要写入的数据的格式以及其排列方式。
  • ...:可变数量的参数,按照格式化字符串中的指示,将数据转换为相应的字符串并写入目标字符串。

snprintf()函数与sprintf()函数类似,但具有额外的安全性限制。可以通过指定目标字符串的最大长度来避免缓冲区溢出的风险。

示例代码如下:

#include <stdio.h>

int main() {
    char str[100];
    int num = 123;
    float f = 3.14;

    snprintf(str, sizeof(str), "数字:%d,浮点数:%.2f", num, f);

    printf("结果字符串:%s\n", str);

    return 0;
}

 运行结果:

结果字符串:数字:123,浮点数:3.14

10.字符串转换为格式化函数sscanf

sscanf()函数用于从一个指定的字符串中按照指定的格式解析数据并存储到变量中。它的原型如下:

int sscanf(const char *str, const char *format, ...);

参数解释:

  • str:要解析的字符串。
  • format:指定的解析格式,用于匹配字符串中的数据。
  • ...:待接收解析结果的变量。

sscanf()函数从字符串中按照指定的格式解析数据,并将解析的结果存储到相应的变量中。

示例代码如下:

#include <stdio.h>

int main() {
    char str[] = "数字:123,浮点数:3.14";
    int num;
    float f;

    sscanf_s(str, "数字:%d,浮点数:%f", &num, &f);

    printf("解析后的数字:%d\n", num);
    printf("解析后的浮点数:%f\n", f);

    return 0;
}

 运行结果: 

解析后的数字:123
解析后的浮点数:3.140000

注意:

在Visual Studio 2022中,Microsoft引入了安全检查机制来提高代码的安全性。这个机制会将一些常见的不安全函数(如scanf、gets、sprintf、sscanf等)标记为警告信息,以减少潜在的安全风险。

如果你想避免这些警告信息,可以考虑以下几种方法:

  1. 使用更加安全的函数:替换不安全的函数为更加安全的函数是最简单的方法之一。例如,可以使用scanf_s、sprintf_s、sscanf_s等安全函数代替原来的函数。示例如下:

    scanf_s("%s", buffer, sizeof(buffer));
    gets_s(str);
    sprintf_s(output, "num1: %d, num2: %d", num1, num2);
    sscanf_s(str, "数字:%d,浮点数:%f", &num, &f);
  2. 禁用警告:如果你确定自己的代码逻辑正确且不容易受到恶意注入攻击,在特定的代码段上禁用警告也是一种选择。可以使用#pragma warning指令来具体控制哪些警告被禁用。

    #pragma warning(disable:4996)
  3. 使用预处理指令:另一种方法是使用预处理指令来定义宏,以屏蔽相关警告信息。可以使用#define _CRT_SECURE_NO_WARNINGS来禁用与安全函数相关的警告。

    #define _CRT_SECURE_NO_WARNINGS
    
  4. 切换编译器: 如果以上三种方法都不适用或无效,可以尝试切换到其他支持较新标准的编译器,或者通过修改编译选项来关闭该警告。

需要注意的是,尽管可以采取上述措施来消除警告,但在代码中应始终注意安全性和防范缓冲区溢出等问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中的基本输入输出 的相关文章

  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 软件测试|使用matplotlib绘制平行坐标系图

    简介 绘制平行坐标系图 Parallel Coordinates Plot 是一种用于可视化多维数据的强大方法 在这篇文章中 我们将介绍如何使用Matplotlib库创建平行坐标系图 以及如何解释和定制这种图表 我们将使用一个示例数据集来演
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 基于java的学生成绩在线管理系统设计与实现

    基于java的学生成绩在线管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生成绩在线管理系统设计与实现的研究背景和动机是设计一个可以方便管理学生成绩的系统 该系统可以方便地记录学生的成绩 并为老师和学生提供查询和统计功能
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 【计算机毕业设计】毕业生就业管理微信小程序_lm9q0

    腾讯公司在2017年1月19日发布了一款不需要下载 不需要卸载 不需要存储的软件叫微信小程序 受到了很多人的喜欢 微信小程序自2017年发布至今 依托微信的社交属性和庞大的用户基数 已经渗透到生活的方方面面 1 微信小程序可以将基于微信平台
  • 【计算机毕业设计】白优校园社团网站的设计与实现

    近些年 随着中国经济发展 人民的生活质量逐渐提高 对网络的依赖性越来越高 通过网络处理的事务越来越多 随着白优校园社团网站的常态化 如果依然采用传统的管理方式 将会为工作人员带来庞大的工作量 这将是一个巨大考验 需要投入大量人力开展对社团
  • Python自动化测试 | 如何使用Robot Framework进行自动化测试?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 华为OD机试 Java 【计算文件大小】

    题目 一个电脑文件夹系统 每个文件夹里都有一些文件和可能还有其他子文件夹 给定所有文件夹的大小和子文件夹列表 你的任务是找出某一个文件夹及其所有子文件夹里的文件总大小 输入格式 首行有两个数字 文件夹的总数M和你要查询的文件夹ID N 之后
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 计算机Java项目|基于SSM的篮球系列网上商城设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • Python 文件的复制重命名以及xlsx文件中表格分开保存

    1 需要的头文件 import shutil import os import openpyxl 2 复制文件以及重命名 直接使用shutil库复制 重命名 移动即可 函数封装示例 source path 为全局变量被复制文件路径 dest
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • 【心电图基线估计和去噪方法的群稀疏正则化】带有群稀疏正则化的心电图基线估计和去噪(Matlab实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • sychnorized积累

    sychnorized 1 对象锁 包括方法锁 默认锁对象为this 当前实例对象 和同步代码块锁 自己指定锁对象 2 类锁 指synchronize修饰静态的方法或指定锁对象为Class对象 3 加锁和释放锁的原理 现象 时机 内置锁th
  • 软件测试/测试开发|给你剖析闭包与装饰器的魔力

    测试管理班是专门面向测试与质量管理人员的一门课程 通过提升从业人员的团队管理 项目管理 绩效管理 沟通管理等方面的能力 使测试管理人员可以更好的带领团队 项目以及公司获得更快的成长 提供 1v1 私教指导 BAT 级别的测试管理大咖量身打造

随机推荐

  • 脑电EEG代码开源分享 【4.特征提取-频域篇】

    往期文章 希望了解更多的道友点这里 0 分享 脑机接口 人工智能 的学习之路 1 1 脑电EEG代码开源分享 1 前置准备 静息态篇 1 2 脑电EEG代码开源分享 1 前置准备 任务态篇 2 1 脑电EEG代码开源分享 2 预处理 静息态
  • Linux 文件共享(两种方法)

    一 实验目的 快速掌握Linux文件共享 共享文件夹 的两种方法 1 通过虚拟机ubuntu在 mnt hgfs下的共享文件夹映射到物理机实现 2 通过物理机的映射网络驱动器连接到虚拟机ubuntu的共享文件夹实现 二 实验环境 工具软件
  • 《算法图解》——第八章 贪婪算法

    第八章 贪婪算法 1 简单的贪婪算法 每步都采取最优的做法 每步都选择局部最优解 2 背包问题 有些情况下 完美是优秀的敌人 如果你只需要找到一个大致解决问题的算法 贪婪算法挺不错 因为实现容易 结果与正确结果相当接近 练习8 1 你在一家
  • 一文了解Clickhouse

    ClickHouse是什么 ClickHouse是一个存储计算一体的工具 其与spark flink等大数据框架不同的在于它有自己的存储层 在数据压缩 存储上做了更多的优化 所以导致它在某些数据处理能力上比其他工具快上了不少 毕竟一般框架只
  • OpenWrt的SR9000有线网卡驱动

    SR9000芯片的有线网卡驱动可以直接使用kmod usb net CDC ether 若为编译 可采取如下措施 make menuconfig kernel module usb support kmod usb net CDC ethe
  • PAT (Basic Level) Practice 1033 旧键盘打字 Python

    根据题意 这道题让我们根据要求去除第二行输入的字符串中的部分内容 1 判断上档键是否损坏 以进行下一步处理 2 根据要求去除字符串中特定字符 3 sys模块 可用于大量输入的加速 4 operator 可用于运算时的加速 代码如下 impo
  • Eclipse搭建stm32+jlink开发环境全攻略(高级篇)

    Eclipse搭建stm32 jlink开发环境全攻略 高级篇 一 问题概况 通过初级篇的学习 我们知道了一个Eclipse工程的配置以及调试 貌似使用也没什么问题 然而 当我们抛弃掉Eclipse自带的工程模版是 也抛弃的他的一些其他的功
  • 机器学习:多分类的logistic回归

    机器学习 多分类的logistic回归 Multi Class Logistic 多分类的Logistic问题 它适用于那些类别数大于2的分类问题 并且在分类结果中 样本x不是一定只属于某一个类可以得到样本x分别属于多个类的概率 也可以说样
  • Unity3D【脚本】 按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板

    按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板 效果图 脚本 using UnityEngine using System Collections public class Exit MonoBehaviour public Game
  • 【Xilinx】SynchronousInterruptHandler错误排查笔记

    SynchronousInterruptHandler错误排查笔记 一 ArmV8的异常处理 二 64位lscript ld的修改 三 asm vectors S的修改 四 SynchronousInterruptHandler函数解析 五
  • 一篇文章学会使用摩斯密码,简单易懂,你也可以使用“降维打击”

    阅读之前 大家请先看一行符号 看看大家能不能猜出这段符号所代表的含义 相信能看出这段符号含义的人还是占少数 没关系 通过阅读久见菌的这篇文章保证让你能看懂这是什么意思 摩尔斯电码的发明 上面这一串符号就是使用摩尔斯电码打出来的英语单词 摩尔
  • Latex特殊符号大全(高清)

    Latex符号大全 转载内容供自己阅读 原文 Latex特殊符号大全 高清
  • Cmake学习

    Cmake学习 CMake调用boost的编译脚本 cmake minimum required VERSION 3 14 project boost python 设置支持C 11特性 set CMAKE CXX STANDARD 11
  • 鸟哥的Linux私房菜PDF在线阅读

    鸟哥的Linux私房菜在线阅读 我在网上查了好久都没有找到正经的关于鸟哥的linux私房菜的PDF版本 要么就是耍流氓的要钱 给了钱 也不一定能得到完整版的PDF 我也只找到了在线版的 在这里供献出来 仅供大家学习参考之用 至于PDF版的
  • 如何查看linux服务器是否为amd64架构还是x86_64架构

    前言 环境 centos 7 9 我们在下载软件时 软件包后面通常带有amd64的字样 那么如何知道我们的服务器是不是amd64架构呢 下面的这些命令可以查看linux的版本及其他信息 查看linux内核版本 root master cat
  • 计算机网络-应用层协议2(FTP)

    1 文件传输协议 FTP 原理 如图所示 FTP工作原理如下 用户或主机通过FTP用户接口与FTP客户进程交互 该用户首先提供远程主机的主机名 使本地主机的FTP客户进程建立一个到远程FTP服务器进程的TCP连接 紧接着该用户提供用户标识和
  • 各种Java加密算法

    如基本的单向加密算法 BASE64 严格地说 属于编码格式 而非加密算法 MD5 Message Digest algorithm 5 信息摘要算法 SHA Secure Hash Algorithm 安全散列算法 HMAC Hash Me
  • 华为Atlas200dk使用第三步------只用一根网线登录华为开发板

    华为开发板Atlas200DK ARES500DK开发板 开发板使用心得系列文章目录 第三章 一根线登录华为开发板 目录 前言 同时使用网线和串口线连接开发板有点多余 线多显得乱 串口连接开发板也比较繁琐 因此本文给大家提供两种使用一根网线
  • FLutter Error: ADB exited with exit code 1 Performing Streamed Install

    出现这个原因是模拟器存储空间满了没办法安装运行新的应用 打开模拟器界面将原先一些不要的应用卸载了就能安装了
  • C语言中的基本输入输出

    目录 1 字符输出函数putchar 2 字符输入函数getchar 3 格式化输出函数printf 4 格式化输入函数scanf 5 字符串接收函数gets 6 字符串接收函数fgets 7 字符串输出函数puts 8 格式化转换为字符串