详解C语言字符和字符串的输入与输出
字符和字符串的输入与输出
- 一、字符的输入与输出
- 1.1 字符的输入
- 使用 `getchar()`
- 使用 `scanf()`
- 1.2 字符的输出
- 使用 `putchar()`
- 使用 `printf()`
- 二、字符串的输入与输出
- 2.1 字符串的输入
- 使用 `scanf()` 输入字符串
- 使用 `fgets()` 输入字符串
- 2.2 字符串的输出
- 使用 `printf()` 输出字符串
- 使用 `puts()` 输出字符串
- 三、总结与注意事项
在C语言中,字符(char)和字符串(char[] 或 char*)是常用的数据类型,通常用于处理文本数据。
一、字符的输入与输出
1.1 字符的输入
使用 getchar()
getchar()
是一个标准库函数,它从标准输入流(通常是键盘)中读取一个字符,并返回该字符(包括换行符)。
#include <stdio.h>int main() {char ch;ch = getchar(); // 读取一个字符printf("输入的字符是:%c\n", ch);return 0;
}
要点:
getchar()
读取的是一个字符(包括空格和换行符)。如果你输入了字母或数字,它会返回相应的字符。- 输入一个字符后,按
Enter
键后,字符和换行符会被返回。
注意: 输入时,getchar()
会读取所有字符,包括空格和换行符。如果你想处理换行符,通常需要额外的代码来处理。
使用 scanf()
scanf()
也可以用来读取字符,但它通常用于格式化输入。
#include <stdio.h>int main() {char ch;printf("请输入一个字符:");scanf("%c", &ch); // 读取一个字符printf("输入的字符是:%c\n", ch);return 0;
}
要点:
scanf("%c", &ch)
会读取一个字符,并存储在ch
中。输入字符后,你需要按下Enter
键。
注意:
- 如果在输入其他数据之后使用
scanf("%c", &ch)
,它会读取输入缓冲区中的换行符或空格。为了避免这一点,可以在之前添加getchar()
以清空缓冲区,或者直接使用scanf()
时忽略换行符。
scanf("%c", &ch); // 直接读取字符
1.2 字符的输出
使用 putchar()
putchar()
是标准库函数,用于将一个字符输出到标准输出(通常是屏幕)。
#include <stdio.h>int main() {char ch = 'A';putchar(ch); // 输出字符 'A'return 0;
}
要点:
putchar(ch)
会将字符ch
输出到屏幕,不会自动换行。
使用 printf()
printf()
是更常用的输出函数,也可以用来输出字符。
#include <stdio.h>int main() {char ch = 'A';printf("%c\n", ch); // 输出字符 'A',并换行return 0;
}
要点:
%c
是printf
的格式化输出符号,用于输出单个字符。- 如果你需要换行,可以手动添加
\n
。
二、字符串的输入与输出
字符串是由字符组成的数组,因此处理字符串时,实际上是处理一个以 \0
(空字符)结尾的字符数组。
2.1 字符串的输入
使用 scanf()
输入字符串
scanf()
可以用来读取字符串,但它有一个重要的限制:它遇到空格、制表符或换行符会停止读取。它不会处理这些空白字符。
#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");scanf("%s", str); // 读取一个不包含空格的字符串printf("输入的字符串是:%s\n", str);return 0;
}
要点:
%s
会读取连续的非空白字符,直到遇到空格或换行符为止。scanf("%s", str)
不会读取空格,如果输入中有空格,只有第一个单词会被读取。
注意:
- 如果输入的字符串超过了指定的大小(如
str[100]
),会发生缓冲区溢出。因此,为了避免这一问题,应该限定scanf()
读取的字符数:scanf("%99s", str); // 最多读取99个字符,留出一个空间给 '\0'
使用 fgets()
输入字符串
fgets()
是一个更安全、更灵活的输入函数,它允许读取一整行(包括空格),并且会自动在字符串末尾加上 \0
。
#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");fgets(str, sizeof(str), stdin); // 读取一行,包含空格printf("输入的字符串是:%s\n", str);return 0;
}
要点:
fgets()
可以读取包含空格的整行文本。- 它会读取换行符(如果输入中包含的话),并且需要处理换行符。
处理换行符:
- 如果输入包含换行符,你可能需要手动去除它。可以使用
strcspn()
来查找并去除换行符:str[strcspn(str, "\n")] = '\0'; // 去除换行符
注意:
- 使用
fgets()
时,字符串末尾的换行符会被保留。如果不想要它,可以手动删除。 fgets()
会阻止缓冲区溢出,因为它限制了读取的字符数。
2.2 字符串的输出
使用 printf()
输出字符串
printf()
是输出字符串最常见的方法。
#include <stdio.h>int main() {char str[] = "Hello, World!";printf("%s\n", str); // 输出字符串 "Hello, World!" 并换行return 0;
}
要点:
%s
格式符用于输出字符串,它会自动识别字符串末尾的\0
并停止输出。printf()
输出时,不会自动添加换行符,除非你显式地在字符串中添加\n
或调用printf()
时加上\n
。
使用 puts()
输出字符串
puts()
是另一个输出字符串的函数,和 printf()
不同的是,puts()
会在字符串末尾自动添加换行符。
#include <stdio.h>int main() {char str[] = "Hello, World!";puts(str); // 输出字符串,并自动换行return 0;
}
要点:
puts()
会自动输出换行符,因此你无需手动添加\n
。
三、总结与注意事项
-
字符输入:
getchar()
和scanf("%c", &ch)
都可以读取字符。getchar()
会读取换行符或空格,而scanf("%c")
不会处理这些问题。
-
字符串输入:
scanf("%s", str)
用于读取不包含空格的字符串。fgets(str, sizeof(str), stdin)
用于读取包含空格的字符串,并且更安全。
-
字符输出:
- 使用
putchar(ch)
输出单个字符。 - 使用
printf("%c", ch)
也可以输出字符。
- 使用
-
字符串输出:
printf("%s", str)
用于输出字符串。puts(str)
输出字符串并自动换行。
-
缓冲区和换行符问题:
- 使用
scanf("%s")
时,不能读取包含空格的字符串。建议使用fgets()
来读取整行。 - 使用
fgets()
时要注意字符串末尾的换行符。
- 使用
相关文章:
详解C语言字符和字符串的输入与输出
字符和字符串的输入与输出 一、字符的输入与输出1.1 字符的输入使用 getchar()使用 scanf() 1.2 字符的输出使用 putchar()使用 printf() 二、字符串的输入与输出2.1 字符串的输入使用 scanf() 输入字符串使用 fgets() 输入字符串 2.2 字符串的输出使用 printf() 输出字符串使用…...

adworld - stack2
adworld - stack2 题目概述:给一个数组(自己控制数组大小和填入的数据),并进行(展示, 增加, 修改值, 求平均值, 退出)菜单选项 存在后门函数(system(“/bin/bash”)),但是没找到栈溢出的点 没判断数组的边界造成任意地址修改 但是如何准确…...

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程
若事与愿违,请相信,上天自有安排,允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 进程 进程:就…...
nuget 管理全局包、缓存和临时文件夹
查看文件夹位置 dotnet nuget locals all --list清空数据 # Clear the 3.x cache (use either command) dotnet nuget locals http-cache --clear nuget locals http-cache -clear# Clear the 2.x cache (NuGet CLI 3.5 and earlier only) nuget locals packages-cache -clea…...

linux物理内存管理:node,zone,page
一、总览 对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图: 上面的概念做下简单的介绍: Node:…...
uniapp 设置安全区域
<!-- 获取安全区域 --> <script setup lang"ts"> import { computed, ref } from vuelet systemType ref(1) // #ifdef APP-PLUS || H5 || APP-PLUS-NVUE systemType.value 1 const { safeAreaInsets } uni.getSystemInfoSync() console.log(safeAre…...

渐进式JavaScript框架Vue 3 入门
目录 前言1. Vue 3 的基础入门1.1 什么是 Vue.js1.2 局部使用 Vue 2. Vue 3 的基本配置2.1 准备 HTML 页面并引入 Vue 模块2.2 创建 Vue 应用实例 3. Vue 的数据绑定与界面渲染3.1 插值表达式 4. 常用指令详解4.1 v-for 指令:列表渲染4.2 v-bind 指令:绑…...
【真题笔记】21年系统架构设计师案例理论点总结
【真题笔记】21年系统架构设计师案例理论点总结 从机器学习定义的灵活性和学习算法的可扩展性,对解释器+管道过滤器+隐式调用进行对比分析!面向对象方法开发软件,建立对象模型+动态模型+功能模型,三者关联关系!数据架构的设计过程包括:数据定义、数据分布、数据管理,三者…...

PostgreSQL的奥秘:深入探究事务与锁的秘密世界
PostgreSQL事务 1. 概述 在数据库系统中,事务(Transaction)是执行数据库操作的最小逻辑单位。它确保了一组操作的完整性和一致性。事务可以通过显式的 BEGIN、COMMIT 和 ROLLBACK 语句块来控制,也可以在自动提交模式(…...

Python进行GRPC和Dubbo协议的高级测试
在微服务架构日益流行的今天,分布式系统的复杂性不断增加。GRPC 和 Dubbo 协议作为当今互联网行业中常见的高性能通信协议,已经成为服务之间交互的核心。然而,随着服务调用层次的不断增加,如何有效地测试这两种协议,确…...
全程云OA系统QCPES.asmx存在SQL注入漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

从建立TRUST到实现FAIR:可持续海洋经济的数据管理
1. 引言 随着我们对信息管理方式的信任,我们的社会对数字化数据的以来呈指数级增长。为了跟上大数据的需求,通过不断的努力和持续实践,对“good”数据管理方式的共识也在不断发展和演变。 加拿大正在建设国家基础设施和服务以及研究数据管理…...

基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SSM的“汽车销售分析与管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 销售经理系统首页图 客户管理图 车辆销…...

vs2015QT项目添加多语言翻译总结
一、简介 当软件有国际化的需求时,就需要多语言翻译功能,最常见的语言就是支持中文和英语,本文介绍在vs2015QT环境下,进行国际化翻译的具体流程。 二、多语言翻译实现流程 1.底层实现原理介绍 QT写的客户端软件,能…...

替换OpenTSDB和HBase,宝武集团使用IoTDB助力钢铁设备智能运维
时序数据库 IoTDB 应用于宝武集团全基地钢铁时序数据管理,激活数据资产,赋能大型设备智能运维。 1. 背景概述 宝武装备智能科技有限公司(以下简称:宝武智维)是中国宝武设备智能运维专业化平台公司,30 余年始…...

MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现
大家好,我是微学AI,今天给大家介绍一下MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现。MathGPT的核心架构是一个精心设计的多层次系统,旨在有效处理复杂的数学问题。其主要组成部分包括 数学知识图谱…...
前端框架大比拼:React.js, Vue.js 及 Angular 的优势与适用场景探讨
文章目录 前言一、React.js特点使用方法适用场景 二、Vue.js特点使用方法适用场景 三、Angular特点使用方法适用场景 四、如何选择合适的前端框架五、前端框架对项目性能的影响结语 前言 随着互联网技术的飞速发展,前端开发已经从简单的页面展示演变为复杂的应用构…...

MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?
文章目录 MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?一、幻读的定义二、幻读带来的问题(一)语义问题(二)数据一致性问题 三、InnoDB 解决幻读的方法四、总结 MySQL45讲 第二十讲 幻读是什么࿰…...

MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中
MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQ…...

【论文阅读】利用SEM二维图像表征黏土矿物三维结构
导言 在油气储层研究中,黏土矿物对流体流动的影响需要在微观尺度上理解,但传统的二维SEM图像难以完整地表征三维孔隙结构。常规的三维成像技术如FIB-SEM(聚焦离子束扫描电子显微镜)虽然可以获取高精度的3D图像,但成本…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...