嵌入式Linux系统编程 — 4.1 字符串输入输出

目录

1 字符串输出

1.1 字符串输出函数简介

1.2 示例程序

2 字符串输入

2.1 字符串输入简介

2.2 示例程序


程序运行时,需打印信息至标准输出 stdout 设备 或标准错误 stderr设备(譬如屏幕),如调试信息、报错信息、中间产生的变量的值等,以监控和分析状态。同时,程序还需从stdin(如键盘)读取并解析字符串。

1 字符串输出

1.1 字符串输出函数简介

常用的字符串输出函数有 printf()、putchar()、 puts()、 fputc()、 fputs()。我们经常使用 printf()函数来输出字符串信息,而并没有使用到 putchar()、 puts()、 fputc()、 fputs()这些函数,原因在于printf()可以按照自己规定的格式输出字符串信息,一般称为格式化输出;而 putchar()、 puts()、 fputc()、 fputs()这些函数只能输出字符串,不能进行格式转换。

与 printf()一样, putchar()、 puts()、 fputc()、 fputs()这些函数也是标准 I/O 函数, 属于标准 C 库函数, 所以需要包含头文件<stdio.h>,并且它们也使用 stdio 缓冲。

putchar()puts()fputc()fputs() 是用于输出字符串的基本函数,它们的特点如下:

  • putchar() 用来输出单个字符。
  • puts() 用于输出一个字符串,并且会在字符串末尾自动添加换行符。
  • fputc() 功能类似于 putchar(),但它可以指定输出到任意文件流,而不仅仅是标准输出。
  • fputs() 则用于向指定的文件流输出字符串,不会自动添加换行符。

函数的原型如下:

#include <stdio.h>

int putchar(int c); // 输出单个字符 c 到 stdout
int puts(const char *s); // 输出字符串 s 到 stdout,并在末尾添加换行符
int fputc(int c, FILE *stream); // 将字符 c 输出到指定的文件流 stream
int fputs(const char *s, FILE *stream); // 将字符串 s 输出到指定的文件流 stream

1.2 示例程序

#include <stdio.h>

int main() 
{
    char greeting[] = "Hello, World!";
    char name[] = "Linux";

    // 使用 puts 输出字符串,末尾自动添加换行符
    puts(greeting);

    // 使用 putchar 输出单个字符,每次调用输出一个字符
    putchar('H');
    putchar('i');
    putchar('\n');

    // 使用 fputc 输出单个字符到标准错误流 stderr
    fputc('!', stderr);

    // 使用 fputs 输出字符串到标准输出流 stdout,不自动添加换行符
    fputs("Put: ", stdout);
    fputs(name, stdout);
    putchar('\n'); // 手动添加换行符

    return 0;
}

使用 puts() 输出了一个字符串 "Hello, World!",然后使用 putchar() 分别输出了 "Hi" 和换行符。接着使用 fputc() 将字符 '!' 输出到了标准错误流 stderr。最后使用 fputs() 输出了 "Kimi says: " 和字符串 "Kimi",然后手动添加了一个换行符。运行结果如下:

2 字符串输入

2.1 字符串输入简介

常用的字符串输入函数有 gets()、 getchar()、 fgetc()、 fgets()。与 printf()对应, 在 C 库函数中同样也提供了格式化输入函数 scanf()。 scanf()与 gets()、 getchar()、 fgetc()、 fgets()这些函数相比,在功能上确实有它的优势,但是在使用上不如它们方便、简单、更易于使用。

与 scanf()一样, gets()、 getchar()、 fgetc()、 fgets()这些函数也是标准 I/O 函数, 属于标准 C 库函数, 所以需要包含头文件<stdio.h>,并且它们也使用 stdio 缓冲。

gets()、 getchar()、 fgetc()、 fgets()的特点如下:

  • gets() 函数是不安全的,因为它不检查目标缓冲区的大小,可能会导致缓冲区溢出。因此,它已经被废弃,不推荐使用。作为替代,应该使用 fgets()
  • getchar() 函数用于从标准输入读取单个字符。
  • fgetc() 函数用于从指定的文件流读取单个字符,通常用于标准输入。
  • fgets() 函数用于从指定的文件流读取一行数据,最多读取 size-1 个字符,并将结果存储在字符串 s 中。它在读取到换行符时会将其存储在缓冲区中,但不会输出到 stdout

函数原型如下:

char *gets(char *s); // 从 stdin 读取一行数据到字符串 s,直到遇到换行符或 EOF,不推荐使用,已废弃
int getchar(void); // 从 stdin 读取下一个字符
int fgetc(FILE *stream); // 从指定的文件流 stream 读取下一个字符
char *fgets(char *s, int size, FILE *stream); // 从指定的文件流 stream 读取最多 size-1 个字符到字符串 s,直到遇到换行符、EOF 或最大字符数限制

2.2 示例程序

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

int main() {
    char buffer[100];
    char ch;

    // 使用 getchar() 读取单个字符
    printf("Press a key: ");
    ch = getchar(); // 读取单个字符
    // 清除换行符
    while (getchar() != '\n') continue; // 循环直到遇到换行符
    printf("You pressed: %c\n", ch);

    // 使用 fgets() 读取一行文本
    printf("Enter a sentence: ");
    fgets(buffer, sizeof(buffer), stdin); // 读取一行文本
    // 去除末尾的换行符
    if (buffer[strlen(buffer) - 1] == '\n') {
        buffer[strlen(buffer) - 1] = '\0';
    }
    printf("You entered: %s\n", buffer);

    // 使用 fgetc() 读取单个字符
    printf("Press another key: ");
    ch = fgetc(stdin); // 读取单个字符
    // 清除换行符
    while (getchar() != '\n') continue; // 清除换行符
    printf("You pressed again: %c\n", ch);

    return 0;
}

程序演示了如何使用 getchar()fgets()fgetc() 函数从标准输入读取数据。

  • 程序首先提示用户按下一个键,并使用 getchar() 读取这个按键字符,然后清除输入缓冲区中的换行符,并输出用户按下的字符。
  • 接着,程序提示用户输入一行文本,使用 fgets() 读取并存储到 buffer 数组中,同时去除末尾的换行符(如果存在),然后输出用户输入的文本。
  • 最后,程序再次提示用户按下另一个键,使用 fgetc() 读取这个按键字符,清除随后的换行符,并输出用户再次按下的字符。

程序的运行结果如下:


 

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

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

相关文章

数据库课程知识点总结

数据库概述 数据库基本特点&#xff1a;数据结构化&#xff0c;数据独立性&#xff0c;数据冗余小&#xff0c;易扩充&#xff0c;统一管理和控制&#xff0c;永久存储&#xff0c;有组织&#xff0c;可共享 三级模式 模式&#xff1a;一个数据库只有一个模式&#xff0c;是对…

将idea项目代码部署到Linux系统中

目录 1. 将idea与虚拟机建立连接 2. 设置上传到虚拟机的目录 3.上传项目代码 1. 将idea与虚拟机建立连接 打开idea要上传的项目,找到Tools -> Development -> Configuration 设置一个连接的名称,我这里设置为centos 将Type设置为SFTP,点击SSH configuration 开始配…

数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略

一、引言 如何基于具体的DBMS产品&#xff0c;为数据库逻辑结构设计的结果&#xff0c;即关系数据库模式&#xff0c;制定适合应用要求的物理结构 1、在设计数据库物理结构前&#xff0c;数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点&#xff0c;包括提供…

抖音集成:通过MessageBox引领数字化营销新潮流

抖音集成&#xff1a;通过MessageBox引领数字化营销新潮流 在数字化营销的大潮中&#xff0c;企业需要不断探索新的方式来优化其营销策略&#xff0c;以抓住更多的市场机会。抖音作为一款全球知名的短视频社交平台&#xff0c;凭借其庞大的用户群体和高度互动的特性&#xff0…

亿发进销存管理系统+:多终端无缝协同,实现经营销售场景全覆盖

亿发软件凭借产品、市场、业务的深入理解&#xff0c;在进销存基础上进行了延伸&#xff0c;推出多终端、一体化的“进销存管理系统”多元产品矩阵。对企业经营中进货、出货、销售、付款等进行全程跟踪管理。有效辅助企业解决业务管理、销售管理、库存管理、财务管理等一系列问…

【论文阅读】-- TSR-TVD:时变数据分析和可视化的时间超分辨率

TSR-TVD: Temporal Super-Resolution for Time-Varying Data Analysis and Visualization 摘要1 引言2 相关工作3 我们的循环生成方法3.1 损失函数3.2 网络架构 4 结果与讨论4.1 数据集和网络训练4.2 结果4.3 讨论 5 结论和未来工作致谢参考文献附录1 训练算法及优化2 网络分析…

02.Ambari自定义服务开发-metainfo.xml介绍

文章目录 metainfo.xml 介绍配置说明Hbase metainfo.xml配置说明配置参数详细介绍配置文件样例DORIS metainfo.xml 介绍 ​ 在Ambari自定义开发中&#xff0c;metainfo.xml 配置文件起着至关重要的作用。它用于定义服务的元数据信息&#xff0c;包括服务的版本、组件、执行脚本…

RabbitMQ基本概念

RabbitMQ是AMQP协议的一个开源实现&#xff0c;所以其基本概念也就是的 AMQP 协 议中的基本概念。如图3-1所示是 RabbitMQ 的整体架构图。 Message(消息):消息是不具名的&#xff0c;它由消息头和消息体组成。消息体是不透明的&#xff0c; 而消息头则由一系列可选属性组成&…

六西格玛绿带可以跳过,直接学六西格玛黑带吗?真实情况告诉你

在现代企业管理中&#xff0c;六西格玛&#xff08;Six Sigma&#xff09;已经成为提升质量和效率的重要工具。对于很多企业而言&#xff0c;培养内部的六西格玛专家&#xff0c;特别是黑带&#xff08;Black Belt&#xff09;&#xff0c;是推动持续改进的关键。然而&#xff…

如何用Vue3和Plotly.js实现一个交互式世界地图动画

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 利用 Plotly.js 创建交互式世界生命预期地图 应用场景 本代码展示了如何使用 Plotly.js 创建一个交互式世界生命预期地图&#xff0c;允许用户按年份浏览不同国家和地区的生命预期数据。该地图可以用于研究世…

电脑文件concrt140.dll丢失要怎么恢复?靠谱修复方法分析

电脑文件concrt140.dll丢失这种情况&#xff0c;相对来说还是比较少见的&#xff01;但是不代表没有&#xff0c;既然有人出现这种情况了&#xff0c;那么小编势必要给大家详细的讲解一下concrt140.dll这个文件&#xff0c;以及我们要怎么去解决concrt140.dll文件丢失的问题。下…

技术贴 | RNA甲基化修饰m6A的检测——MeRIP-seq

01 m6A是什么 目前在细胞RNA中已经识别到了超过100种化学修饰&#xff0c;其中RNA甲基化修饰在生命活动中有着非常重要的作用(Xu et al 2020)。RNA甲基化是指在甲基转移酶的催化下&#xff0c;在RNA分子上的某一个原子上添加一个甲基基团(CH3)。RNA甲基化修饰类型有很多&#…

架构师篇-5、架构语言-ArchiMate

内容摘要&#xff1a; TOGAF内容元模型TOGAF架构语言ArchiMate3ArchiMate实践案例分享 TOGAF内容框架【核心内容元模型】 作为一个通用且开放式的标准&#xff0c;TOGAF需要采用一种非常灵活的方式来对其内容元模型进行定义&#xff0c;从而使得不同的企业可以根据自身需要对…

Swagger2及常用校验注释说明

Api(value "后台用户管理") RestController RequestMapping("bossuser") public class BossUserController {ApiOperation(value "测试接口")PostMapping("test")public String testUser(Valid RequestBody TestUser user) {LOG.inf…

vue表头字段添加鼠标悬浮提示

<el-table-column prop"jfScore" align"center" min-width"100px"><template slot"header" slot-scope"scope"><div><span>信用积分</span><el-tooltip:aa"scope"class"it…

nodepad 中换行符、tab替换

1 nodepad 主要符号 换行符: \r\n&#xff08;windows&#xff09; tab: \t 2 展示符号 3 相互替换 tip:需要点击扩展 参考&#xff1a; https://blog.csdn.net/lijing742180/article/details/85174564

服务器出现意外情况。(Exception from HRESULT: 0x80010105(RPC E SERVERFAULT))

这种情况一般出现在excel2007版本&#xff0c;下载了什么阅读器之类的 2007改不了这个加载项&#xff0c;需要重装一个其他版本&#xff08;2010版本可以&#xff09; 然后如下操作修改为COM加载项

步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理

文章目录 步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理继承关系入口 DispatcherServlet#doDispatch多文件上传解析获取处理器handler的完整注册流程获取HandlerAdapter执行拦截器PreHandle执行HandlerAdapter.handle参数解析器HandlerMethodArgumentResolv…

抖音外卖服务商有哪些,盘点这几家正规服务商!

当前&#xff0c;抖音外卖的关注度不断上涨&#xff0c;抖音外卖服务商也逐渐成为了众多创业者心中的理想创业赛道。在此背景下&#xff0c;抖音外卖服务商的入局途径多次引发创业者热议&#xff0c;以抖音外卖服务商有哪些公司为代表的相关话题更是长期位居创业者问题榜单的前…

走进机器学习

第1关&#xff1a;走进机器学习 机器学习简介 机器学习近年来被大规模应用在各种领域&#xff0c;特别是 NLP 领域。虽然机器学习是门建立在统计和优化上的新兴学科&#xff0c;但是在自然语言处理、数据科学等领域&#xff0c;它却占据着核心的地位。 图 1 机器学习最初的研…