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

相关文章

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N