C语言 字符串数组的输入输出

代码 

#include <stdio.h>void main()
{char arr[4];scanf("%s",arr);printf("%s\n",arr);for(int i = 0 ; arr[i] != '\0' ; i++){printf("%c\n",arr[i]);}char temp;for(int i = 0;i < 3;i++){for(int j = 0;j < 3-i;j++){if(arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for(int i = 0 ;arr[i] != '\0' ;i++){printf("%c\n",arr[i]);}
}

为什么这段代码最后会多输出一个2出来?

这个问题的根源在于char arr[4];数组的大小和如何使用它。

当你用scanf("%s", arr);读取一个字符串到一个字符数组中时,C语言会自动在字符串末尾添加一个空字符('\0')作为字符串的终止符。这意味着,如果你的数组大小为4,你最多只能安全地存储3个字符的字符串,保留最后一个位置给终止符'\0'

如果你输入了一个3字符的字符串,例如"123",那么在内存中arr会是{'1', '2', '3', '\0'}。但是,如果你输入的字符串超过了3个字符,scanf函数会覆盖数组的边界,可能会导致未定义行为,包括覆盖内存中的其他数据。

在你的代码中,你进行了冒泡排序,这个过程本身没有问题,因为你正确地限制了循环次数以避免访问数组边界之外的元素。然而,如果用户输入的字符串长度恰好为3(不包括终止符),则排序后的字符串仍然会是三个字符加一个终止符,这意味着你需要一个至少为5个元素的数组来安全地容纳4个字符的输入(3个可见字符加上终止符和一个额外的位置以防止溢出)。

当你使用过小的数组而输入的字符串长度达到或超过数组大小时,可能会导致内存越界、覆盖重要的内存区域,并可能在打印时遇到奇怪的行为,比如多打印出一个字符。这个额外的"2"可能是内存中紧接着你的arr数组之后的值,由于内存被意外覆盖,导致'\0'终止符不在预期的位置,所以for循环继续执行并打印出了额外的字符。

为了避免这种情况,你应该增加数组的大小以容纳更长的字符串和终止符,或者使用scanf来限制输入的字符数,如下所示:

#include <stdio.h>void main()
{char arr[4];scanf("%s",arr);printf("%s\n",arr);for(int i = 0 ; arr[i] != '\0' ; i++){printf("%c\n",arr[i]);}char temp;for(int i = 0;i < 3;i++){for(int j = 0;j < 3-i;j++){if(arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for(int i = 0 ;arr[i] != '\0' ;i++){printf("%c\n",arr[i]);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

近年C++面试题目

近年来&#xff0c;C面试题目主要涵盖了从基础知识到高级特性的各个方面。以下是一些常见的C面试题目&#xff1a; 1.基础知识&#xff1a; 解释C中的指针和引用&#xff0c;以及它们之间的区别。描述C中的内存管理&#xff0c;包括堆和栈的区别。阐述C中的面向对象编程概念&am…

Linux服务器在宝塔已经安装了node的前提下手动运行node项目

#一般情况&#xff0c;宝塔都可以正常启动node项目&#xff0c;正确安装依赖&#xff0c;但如果它出错了呢&#xff0c;死活安装不上&#xff0c; 这种情况可能就打算直接用ssh来安装了&#xff0c;但如果直接在ssh终端上输入npm install,会发现提示命令找不到&#xff0c;虽然…

【springcloud开发教程】spring cloud config——分布式配置

什么是SpringCloud config分布式配置中心&#xff1f; spring cloud config 为微服务架构中的微服务提供集中化的外部支持&#xff0c;配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。 spring cloud config 分为服务端和客户端两部分。 服务端也称为 …

MySQL 查询性能优化

优质博文&#xff1a;IT-BLOG-CN​ 如果把查询看作是一个任务&#xff0c;那么它由一些列子任务组成&#xff0c;每个子任务都会消耗一定的时间。如果要优化查询&#xff0c;实际上要优化其子任务&#xff0c;要么消除其中一些子任务&#xff0c;要么减少子任务的执行次数。通常…

【prometheus-operator】k8s监控redis

1、准备exporter https://github.com/oliver006/redis_exporter oliver006-redis_exporter-amd64.tar # 安装镜像 docker load -i oliver006-redis_exporter-amd64.tar # 上传镜像 docker tag oliver006/redis_exporter ip/monitor/redis_exporter:latest docker push ip/mo…

C#关键字 sealed、unsafe、volatile

sealed 应用于某个类时&#xff0c;sealed 修饰符可阻止其他类继承自该类。 在下面的示例中&#xff0c;类 B 继承自类 A&#xff0c;但没有类可以继承自类 B。 class A {} sealed class B : A {}还可以对替代基类中的 虚方法 或 属性的方法 或 属性 使用 sealed 修饰符。 这…

数据分析-Pandas分类数据的操作方法

数据分析-Pandas分类数据的操作方法 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

xpath中使用正则表达式 及 包含 某 属性值

xpath中使用正则表达式 没想到吧 id 也可以模糊定位 比如有个网站正文部分是&#xff1a; //[id‘el-popover-123456’] 另一个同级别页面的正文是&#xff1a; //[id‘el-popover-456789’] 要抓取这种正文其实可以用xpath&#xff1a; //*[starts-with(id, el-popover-)]或…

八个 C++ 开源项目,帮助初学者进阶成长

对于C初学者来说&#xff0c;参与开源项目是提升编程技能、理解实际项目运作和学习最佳实践的绝佳方式。以下是八个适合C初学者的开源项目&#xff0c;可以帮助你进阶成长&#xff1a; 1. **SFML (Simple and Fast Multimedia Library)** - 网址: [SFML](https://www.sfml-…

DevEco Profiler性能调优工具简介

一、概述 应用或服务运行期间可能出现响应速度慢、动画播放不流畅、列表拖动卡顿、应用崩溃或耗电量过高、发烫、交互延迟等现象,这些现象表明应用或服务可能存在性能问题。造成性能问题的原因可能是业务逻辑、应用代码对系统API的误用、对ArkTS对象的不合理持有导致内存泄露…

隐私计算实训营第三讲-详解隐私计算框架及技术要点

隐私计算实训营第三讲-详解隐私计算框架及技术要点 隐语架构概览 隐语架构是一个多层次、全栈的数据隐私保护和安全计算框架&#xff0c;它从产品应用到硬件加速层面&#xff0c;提供了一个综合性的解决方案。这一架构通过整合隐私保护原语、密态与明文计算引擎&#xff0c;并…

记录开发STM32遇到的卡死问题-串口

背景&#xff1a;以STM32作为主控&#xff0c;广州大彩显示屏显示&#xff0c;主控实时采集数据&#xff0c;串口波特率115200.设置收发频率为50Hz&#xff0c;即单片机每秒发送50帧数据&#xff0c;每秒接收50帧数据&#xff0c;每帧数据大概14字节。 问题&#xff1a;系统长…

部署prometheus 监控k8s集群

目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP&#xff1a;31940 部署k8集群…

隐私计算实训营学习三:隐私计算框架的架构和技术要点

文章目录 一、隐语架构二、产品层三、算法层3.1 PSI与PIR3.2 Data Analysis-SCQL3.3 Federated Learning 四、计算层4.1 混合调度编译-RayFed4.2 密态引擎4.3 密码原语YACL 五、资源管理层六、互联互通七、跨域管控 一、隐语架构 1、完备性&#xff1a;支持多种技术&#xff0…

docker构建镜像时可能会用到的自启动命令

在 Linux 中&#xff0c;各种服务的自启动命令可以通过 systemd 来管理。当你将服务部署到 Docker 中时&#xff0c;可以通过在 Dockerfile 或 Docker Compose 文件中设置相应的命令来实现这些服务在容器启动时自动启动。以下是一些常见的 Linux 服务的自启动命令和在 Docker 中…

基于Springboot的牙科就诊管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的牙科就诊管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍: 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c…

RocketMq 顺序消费、分区消息、延迟发送消息、Topic、tag分类 实战 (消费者) (三)

消费端配置 如下所示&#xff1a;是消费者的配置类&#xff0c;有以下几点需要注意的地方 1、是TargetMessageListener这个监听类&#xff08;下文会把这个监听类的具体代码贴出来&#xff09;&#xff0c;需要把这个监听类订阅。 2、rocketMqDcProperties.getTargetProperties…

蓝桥杯day9刷题日记

P8649 [蓝桥杯 2017 省 B] k 倍区间 思路&#xff1a;前缀和的题&#xff0c;对k取余相同的数就可以得到k的倍数 #include <iostream> #include <string> using namespace std; long long ans; int n,k; long long q[100010]; long long sum[100010];int main() …

Redis 教程系列之Redis 安全(六)

我们可以通过 redis 的配置文件设置密码参数&#xff0c;这样客户端连接到 redis 服务就需要密码验证&#xff0c;这样可以让你的 redis 服务更安全。 实例 我们可以通过以下命令查看是否设置了密码验证&#xff1a; 127.0.0.1:6379> CONFIG get requirepass 1) "re…

小程序返回webview h5 不刷新问题

我的场景&#xff1a;a、小程序首页-》b、webview h5活动列表-》c、小程序活动详情 c返回b b无法刷新 网上说了好多办法试过了都不行 求解啊 比如 1、先清空URL在赋值 <web-view wx:if"{{url}}" src"{{url}}" bindmessage"onMessage"&g…