C语言入门(字符串正反连接(fgets()、gets()用法))

2023-12-19 07:28

本文主要是介绍C语言入门(字符串正反连接(fgets()、gets()用法)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

​编辑

题目描述

输入格式

输出格式

样例输入

样例输出

解题思路


题目描述

所给字符串正序和反序连接,形成新串并输出

输入格式

任意字符串(长度<=50)

输出格式

字符串正序和反序连接所成的新字符串

样例输入

123abc

样例输出

123abccba321

解题思路

输入字符串,把它的逆序字符串存放在原字符串后面,然后输出;

注意事项:
放在原字符串后面时,要从第lenth-1的位置开始放,直到原字符串第一个字符放入为止;

即:

for( i=strlen(a),j=strlen(a)-1; j>=0; i++,j--)
{a[i]=a[j];
}

最后要加上' \0';

有一种的思路是,循环不是以原字符串第一个字符结束,而是以原字符串长度的两倍-1结束,

即:(下面这样是不对的,因为a[ strlen(a) ]原来是' \0', 被放字符后,求出长度不对,并且a的长度在改变)

for( i=strlen(a),j=strlen(a)-1; i<2*strlen(a); i++,j--)
{a[i]=a[j];
}

代码示例:

#include <stdio.h>
#include <string.h>
int main()
{char a[101];int i, j = 1;gets(a);for(i = strlen( a ), j = strlen( a ) - 1; j >= 0; i++, j--){a[i] = a[j];}a[i] = '\0';puts(a);return(0);
}

        对于上述代码,我们可以再dev C++中正常运行,但是如果我们将该代码放到Visual Studio中进行编辑,会发现

    gets(a);

报错,这是因为在C语言中,gets(a)用于从标准输入(键盘)获取一行字符串,并将其保存到字符数组a中。它是一个不安全的函数,因为它无法防止输入的字符串超过目标字符数组的大小,可能导致缓冲区溢出。由于gets()存在安全性问题,它已被标记为不推荐使用,并在C11标准中被移除。

使用gets(a)时,需要注意以下几点:

  1. 字符数组a必须足够大以容纳输入的字符串,包括字符串的结尾空字符\0
  2. 如果输入的字符串长度超过了字符数组的大小,会发生缓冲区溢出,导致未定义的行为。
  3. gets()函数不提供任何限制或验证输入的能力,因此要确保输入的字符串长度不会超过目标字符数组的大小。

        在现代C编程中,推荐使用更安全的函数fgets()替代gets(),因为fgets()可以指定最大读取的字符数,避免缓冲区溢出问题。

  fgets()函数用于从输入流中读取一行字符串,并将其保存到指定的字符数组中。它提供了更安全的方式来读取字符串,因为你可以指定最大读取的字符数,避免缓冲区溢出问题。

fgets()函数的原型如下

char* fgets(char* str, int num, FILE* stream);

参数说明:

  • str:指向目标字符数组的指针,用于保存读取的字符串。
  • num:要读取的最大字符数(包括结尾的换行符和空字符)。
  • stream:要读取的输入流,通常使用stdin表示标准输入。

  fgets()函数的返回值是一个指向目标字符数组的指针,如果读取成功,则返回str;如果发生错误或到达文件末尾,则返回NULL

#include <stdio.h>
#include <string.h>
int main()
{char a[101];int i, j = 1;fgets(a, sizeof(a), stdin);for (i = strlen(a), j = strlen(a) - 1; j >= 0; i++, j--){a[i] = a[j];}a[i] = '\0';puts(a);return(0);
}

        不过在使用fgets()我们又会发现,最终结果成这样

        那是因为fgets()函数将包括换行符\n在内的输入一并读取到字符数组中,因此如果你想去掉换行符,可以使用字符串处理函数strcspn()或手动处理字符串。

最终代码:

#include <stdio.h>
#include <string.h>
int main()
{char a[101];int i, j = 1;fgets(a, sizeof(a), stdin);// 去掉换行符a[strcspn(a, "\n")] = '\0';for (i = strlen(a), j = strlen(a) - 1; j >= 0; i++, j--){a[i] = a[j];}a[i] = '\0';puts(a);return(0);
}

Visual Studio编辑器中C4996 ‘scanf‘: This function or variable may be unsafe.问题解决方案-CSDN博客

C语言练习(检查一个数是否为质数 、剪绳子)-CSDN博客

这篇关于C语言入门(字符串正反连接(fgets()、gets()用法))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511356

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC