详解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图像,但成本…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
