当前位置: 首页 > news >正文

详解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;
}

要点:

  • %cprintf 的格式化输出符号,用于输出单个字符。
  • 如果你需要换行,可以手动添加 \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

三、总结与注意事项

  1. 字符输入

    • getchar()scanf("%c", &ch) 都可以读取字符。
    • getchar() 会读取换行符或空格,而 scanf("%c") 不会处理这些问题。
  2. 字符串输入

    • scanf("%s", str) 用于读取不包含空格的字符串。
    • fgets(str, sizeof(str), stdin) 用于读取包含空格的字符串,并且更安全。
  3. 字符输出

    • 使用 putchar(ch) 输出单个字符。
    • 使用 printf("%c", ch) 也可以输出字符。
  4. 字符串输出

    • printf("%s", str) 用于输出字符串。
    • puts(str) 输出字符串并自动换行。
  5. 缓冲区和换行符问题

    • 使用 scanf("%s") 时,不能读取包含空格的字符串。建议使用 fgets() 来读取整行。
    • 使用 fgets() 时要注意字符串末尾的换行符。

相关文章:

详解C语言字符和字符串的输入与输出

字符和字符串的输入与输出 一、字符的输入与输出1.1 字符的输入使用 getchar()使用 scanf() 1.2 字符的输出使用 putchar()使用 printf() 二、字符串的输入与输出2.1 字符串的输入使用 scanf() 输入字符串使用 fgets() 输入字符串 2.2 字符串的输出使用 printf() 输出字符串使用…...

adworld - stack2

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

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程

若事与愿违&#xff0c;请相信&#xff0c;上天自有安排&#xff0c;允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程 进程&#xff1a;就…...

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

一、总览 对于物理内存内存&#xff0c;linux对内存的组织逻辑从上到下依次是&#xff1a;node&#xff0c;zone&#xff0c;page&#xff0c;这些page是根据buddy分配算法组织的&#xff0c;看下面两张图&#xff1a; 上面的概念做下简单的介绍&#xff1a; Node&#xff1a…...

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 指令&#xff1a;列表渲染4.2 v-bind 指令&#xff1a;绑…...

【真题笔记】21年系统架构设计师案例理论点总结

【真题笔记】21年系统架构设计师案例理论点总结 从机器学习定义的灵活性和学习算法的可扩展性,对解释器+管道过滤器+隐式调用进行对比分析!面向对象方法开发软件,建立对象模型+动态模型+功能模型,三者关联关系!数据架构的设计过程包括:数据定义、数据分布、数据管理,三者…...

PostgreSQL的奥秘:深入探究事务与锁的秘密世界

PostgreSQL事务 1. 概述 在数据库系统中&#xff0c;事务&#xff08;Transaction&#xff09;是执行数据库操作的最小逻辑单位。它确保了一组操作的完整性和一致性。事务可以通过显式的 BEGIN、COMMIT 和 ROLLBACK 语句块来控制&#xff0c;也可以在自动提交模式&#xff08…...

Python进行GRPC和Dubbo协议的高级测试

在微服务架构日益流行的今天&#xff0c;分布式系统的复杂性不断增加。GRPC 和 Dubbo 协议作为当今互联网行业中常见的高性能通信协议&#xff0c;已经成为服务之间交互的核心。然而&#xff0c;随着服务调用层次的不断增加&#xff0c;如何有效地测试这两种协议&#xff0c;确…...

全程云OA系统QCPES.asmx存在SQL注入漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

从建立TRUST到实现FAIR:可持续海洋经济的数据管理

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

基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)

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

vs2015QT项目添加多语言翻译总结

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

替换OpenTSDB和HBase,宝武集团使用IoTDB助力钢铁设备智能运维

时序数据库 IoTDB 应用于宝武集团全基地钢铁时序数据管理&#xff0c;激活数据资产&#xff0c;赋能大型设备智能运维。 1. 背景概述 宝武装备智能科技有限公司&#xff08;以下简称&#xff1a;宝武智维&#xff09;是中国宝武设备智能运维专业化平台公司&#xff0c;30 余年始…...

MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下MathGPT的原理介绍&#xff0c;在中小学数学教学的应用场景&#xff0c;以及代码样例实现。MathGPT的核心架构是一个精心设计的多层次系统&#xff0c;旨在有效处理复杂的数学问题。其主要组成部分包括 数学知识图谱…...

前端框架大比拼:React.js, Vue.js 及 Angular 的优势与适用场景探讨

文章目录 前言一、React.js特点使用方法适用场景 二、Vue.js特点使用方法适用场景 三、Angular特点使用方法适用场景 四、如何选择合适的前端框架五、前端框架对项目性能的影响结语 前言 随着互联网技术的飞速发展&#xff0c;前端开发已经从简单的页面展示演变为复杂的应用构…...

MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?

文章目录 MySQL45讲 第二十讲 幻读是什么&#xff0c;幻读有什么问题&#xff1f;一、幻读的定义二、幻读带来的问题&#xff08;一&#xff09;语义问题&#xff08;二&#xff09;数据一致性问题 三、InnoDB 解决幻读的方法四、总结 MySQL45讲 第二十讲 幻读是什么&#xff0…...

MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中

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

【论文阅读】利用SEM二维图像表征黏土矿物三维结构

导言 在油气储层研究中&#xff0c;黏土矿物对流体流动的影响需要在微观尺度上理解&#xff0c;但传统的二维SEM图像难以完整地表征三维孔隙结构。常规的三维成像技术如FIB-SEM&#xff08;聚焦离子束扫描电子显微镜&#xff09;虽然可以获取高精度的3D图像&#xff0c;但成本…...

可靠UDP协议(KCP)使用说明

希望这篇文章&#xff0c;对学习和使用 KCP 协议的读者&#xff0c;有帮助。 1. KCPUDP 流程图 2. 示例代码&#xff08;待补充&#xff09; #include <iostream>int main() {// TODO: kcp examplereturn 0; }...

ffmpeg+D3D实现的MFC音视频播放器,支持录像、截图、音视频播放、码流信息显示等功能

一、简介 本播放器是在vs2019下开发&#xff0c;通过ffmpeg实现拉流解码功能&#xff0c;通过D3D实现视频的渲染功能。截图功能采用libjpeg实现&#xff0c;可以截取jpg图片&#xff0c;图片的默认保存路径是在C:\MYRecPath中。录像功能采用封装好的类Mp4Record实现&#xff0c…...

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…...

Node.js 版本管理的最终答案 Volta

文章目录 特点安装Unix系统安装Windows系统安装 常用命令volta fetchvolta installvolta uninstallvolta pinvolta listvolta completionsvolta whichvolta setupvolta runvolta help 建议 目前对于前端项目的node 版本&#xff0c;我们一般会在项目 package.json 的 engines 字…...

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…...

Vue vs React:两大前端框架的区别解析

在现代前端开发中&#xff0c;Vue.js 和 React.js 是两个最受欢迎的框架和库。我们常常面临选择它们的困惑。虽然这两者在本质上都是为了构建用户界面而设计的&#xff0c;但它们在设计理念、使用方式和生态系统等方面有着显著的区别。今天&#xff0c;我们将通过深入分析这两个…...

【树莓派raspberrypi烧录Ubuntu远程桌面登入树莓派】

提示&#xff1a;本文利用的是Ubuntu主机和树莓派4B开发板&#xff0c;示例仅供参考 文章目录 一、树莓派系统安装下载前准备工作下载安装树莓派的官方烧录软件imagerimager的使用方法 二、主机与树莓SSH连接查看数梅派IP地址建立ssh连接更新树莓派源地址 三、主机端远程桌面配…...

c# 调用c++ 的dll 出现找不到函数入口点

今天在调用一个设备的dll文件时遇到了一点波折&#xff0c;因为多c 不熟悉&#xff0c;调用过程张出现了找不到函数入口点&#xff0c;一般我们使用c# 调用c 文件&#xff0c;还是比较简单。 [DllImport("AtnDll2.dll",CharSet CharSet.Ansi)]public static extern …...

LInux——环境基础开发工具使用(正在更新中...)

1.软件包管理器 Linux下安装软件的方案&#xff1a; 1. 源代码安装 2. rpm包安装 3. 包管理器安装 --- yum/ apt &#xff08;此图片来自于比特就业课课件&#xff09; 1.1 操作生态系统 好的操作系统定义&#xff1a; 生态环境好 不同的操作系统根本是生态不同&#xff08;…...

linux 内核asmlinkage关键字总结

1&#xff0c;看一下asmlinkage的定义 CPP_ASMLINKAGE __attribute__((regparm(0))) GCC中使用__attribute__((regparm(n)))指定最多可以使用n个寄存器&#xff08;eax, edx, ecx&#xff09;传递参数&#xff0c;n的范围是0~3&#xff0c;超过n时则将参数压入栈中&#xff08;…...