【C语言字符串】一道题检验你的字符串学习情况

news2024/11/15 14:08:57

作者:@匿名者Unit

在这里插入图片描述

目录

  • 一.字符串引言
  • 1.字符串基础
    • 二.洛谷P5734详解
      • 1.字符串相关库函数
          • (1) strcpy函数
          • (2) strcat函数
          • (3)strstr函数
      • 2.题目讲解

一.字符串引言

1.字符串基础

字符串通常以\0作为结束标志,\0的ASCll码值为0,计算字符串长度时会忽略斜杠零。

二.洛谷P5734详解

1.字符串相关库函数

在讲解题目之前我们先介绍几个关于字符串操作常用的几个库函数

(1) strcpy函数

strcpy也叫 拷贝函数 ,头文件为 string.h ,顾名思义它可以将一个字符串数组的内容拷贝到另一个数组中。
strcpy函数原型为:

char *strcat(char *dest, const char *src)

下面通过一段代码演示它的效果:

#include <stdio.h>
#include <string.h>

int main()
{
	char ch[20] = "helloworld";
	char arr[10] = "xxxxxx";
	printf("%s", strcpy(ch, arr));
	return 0;
}

因为strcpy函数的返回值是拷贝后数组的地址,所以可以通过链式访问在屏幕上打印出xxxxxx,还需要注意的是拷贝函数目的数组要留够拷贝的空间不然程序会崩溃。

(2) strcat函数

strcat函数称为追加拷贝函数 ,头文件为头文件为 string.h
strcat函数原型为:

char *strcat(char *dest, const char *src)

strcat可以找到目标数组的结束标志\0,并用起始数组代替\0。
我们还是用代码来演示他的效果:

#include <stdio.h>
#include <string.h>

int main()
{
	char ch[15] = "likou";
	char arr[10] = "luogu";
	printf("%s", strcat(ch, arr));
	return 0;
}


结果:
在这里插入图片描述
这个函数同样需要在目标数组开辟足够的空间,才能 正常追加拷贝

(3)strstr函数

strstr函数是字符串查找函数,文件为头文件为 string.h
函数原型为:

char *strstr( const char *arr1, const char *arr2 );

strstr函数可以在arr1数组中查找是否存在arr2数组中的内容,如果存在返回首次出现的地址,不存在则返回空指针 NULL
下面用代码来演示下它的效果:
在这里插入图片描述

以上将几个要用得字符串函数讲解了,接下来我们看题目。

2.题目讲解

  • 我们先来看一下题目:
    在这里插入图片描述
    分析: 题目考察了四个字符串的操作,只要我们掌握以上几个函数,还有熟练运用 数组下标 和字符串的 结束标志 即可。
    逻辑分析与代码编写:

我们先根据题目写出整体的逻辑:

#include<stdio.h>
#include<string.h>

char in[101];

char ch[101];

int main()
{
	int n;
	scanf("%d", &n);
	scanf("%s", &ch);
	for (int i = 0; i < n; i++)
	{
		int k = 0;
		scanf("%d", &k);
		if (k == 1)
		{

		}
		else if (k == 2)
		{

		}
		else if (k == 3)
		{

		}
		else
		{

		}
	}
	return 0;
}

代码实现:

  1. 我们先实现第一个操作:在文档后插入字符串并输出,显然要用到追加拷贝函数strcat,如下:
 if (k == 1)
	{
		scanf("%s", &in);
		printf("%s\n", strcat(ch, in));
	}
  1. 第二步,截取文档从第 a 个字符起 b 个字符输出,只需要在数组第a+b的位置赋为\0在运用拷贝函数操作即可,代码送上 体会一下:
else if (k == 2)
		{
			int a, b;
			scanf("%d %d", &a, &b);
			ch[a + b] = '\0';
			char in[101] = { 0 };
			strcat(in, &ch[a]);  
			strcpy(ch, in);
			ch[b] = '\0';
			printf("%s\n", ch);
		}

因为在上一步操作中对in数组进行了输入,所以这里在使用in数组之前应该将in数组中的元素释放出来。

  1. 第三步,插入片段,在文档中第 a 个(有歧义,是数组下标)字符前面插入字符串,并输出文档的字符串。代码如下:
		else if (k == 3)
		{
			int a;
			//char in[101] = { 0 };
			scanf("%d %s", &a,&in);
			strcat(in, &ch[a]);
			ch[a] = '\0';
			strcat(ch, in);
			printf("%s\n", ch);
		}

上图代码逻辑雀氏妙,大家仔细体会。

  1. 最后一步:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 -1。通过观察示例所知,若存在返回的是下标而不是内存地址(返回下标我们可以使用指针减指针的方式实现),显然这里需要用来strstr函数
	else
		{
			//char in[101] = { 0 };
			scanf("%s",&in);
			char* ret = strstr(ch, in);
			printf("%d\n", ret != NULL ? (int)(ret-ch) : -1);
		}

这样用三目操作符 没想到吧?
在这里插入图片描述


下面完整代码奉上:

#include<stdio.h>
#include<string.h>

char in[101];

char ch[101];

int main()
{
	int n;
	scanf("%d", &n);
	scanf("%s", &ch);
	for (int i = 0; i < n; i++)
	{
		int k = 0;
		scanf("%d", &k);
		if (k == 1)
		{
			scanf("%s", &in);
			printf("%s\n", strcat(ch, in));
		}
		else if (k == 2)
		{
			int a, b;
			scanf("%d %d", &a, &b);
			ch[a + b] = '\0';
			char in[101] = { 0 };
			strcat(in, &ch[a]);  
			strcpy(ch, in);
			ch[b] = '\0';
			printf("%s\n", ch);
		}
		else if (k == 3)
		{
			int a;
			//char in[101] = { 0 };
			scanf("%d %s", &a,&in);
			strcat(in, &ch[a]);
			ch[a] = '\0';
			strcat(ch, in);
			printf("%s\n", ch);
		}
		else
		{
			//char in[101] = { 0 };
			scanf("%s",&in);
			char* ret = strstr(ch, in);
			printf("%d\n", ret != NULL ? (int)(ret-ch) : -1);
		}
	}
	return 0;
}

在源码中可以发现我注释了几处释放in数组的操作,其实我当时在疑惑多次对in数组输入,为什么不需要在下一次之前将in的元素释放掉。真相是 即使数组中保留着上一次输入的字符串 scanf再次输入时 会在字符串后自动补上\0保证上一次的元素无法影响输出(在不越界的情况下)

以上就是这次的全部内容。

感谢阅读,共同进步

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

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

相关文章

008. 子集

1.题目链接&#xff1a; 78. 子集 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给一个元素各不相同的数组 nums&#xff0c;返回各种可能的子集&#xff08;子集不能重复&#xff09; 比如&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[…

做了8年前端,感谢那些优秀的后端,陪伴我工作,教会我成长

☆ 前段时间由于一时的头脑发热&#xff0c;写了一篇《做了8年前端&#xff0c;细说那些曾经让你浴霸不能的后端》的博客&#xff0c;虽然每个细节也都属实吧&#xff0c;但始终是一些负能量的东西&#xff0c;建议大家不要去看了&#xff0c;今年互联网情况已经这样了&#xf…

安卓APP源码和设计报告——体育馆预约系统

项目名称&#xff1a;体育馆体育场预约系统专业&#xff1a;班级&#xff1a;学号&#xff1a;姓名&#xff1a; 目 录 一、项目功能介绍3 二、项目运行环境3 1、开发环境3 2、运行环境3 3、是否需要联网3 三、项目配置文件及工程结构4 1、工程配置文件4 2、工程结构目…

磨金石教育摄影技能干货分享|上海随手拍——叶落满街,秋意未尽

步入十二月以来&#xff0c;气温也随之骤降&#xff0c;这时候才明显感到初冬已至。冬天的寒风就是最好的脱叶剂&#xff0c;走在街道上&#xff0c;抬眼望去两旁的树木多数已经稀疏。只有残留的绿意还在迎着微微的寒风摇动。 我最喜欢的是秋天&#xff0c;因为秋天的草木最有色…

基于keras与tensorflow手工实现ResNet50网络

前言 在文章 基于tensorflow的ResNet50V2网络识别动物&#xff0c;我们使用了keras已经提供的神经网络&#xff0c;完成了图像分类的。这个时候&#xff0c;小明同学就问了&#xff0c;那么我怎么自己去写一个神经网络来进行训练呢&#xff1f; 本文就基于tensorflow&#xff…

Redis原理篇——五种基本数据类型

一、Redis底层数据结构 1. SDS 获取字符串长度耗时&#xff1a; 由于Redis底层是C语言编写的&#xff0c;C语言中没有字符串这个概念&#xff0c;本质上都是字符数组&#xff0c;获取字符串长度就是遍历数组获取长度&#xff08;遍历到 \0结束标识结束 &#xff09;时间复杂度…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校毕业生信息采集系统05hj2

大四计算机专业的同学们即将面临大学4年的最后一次考验--毕业设计。通过完成毕业设计来对过去4年的大学学习生活做一个总结&#xff0c;也是检验我们学习成果的一种方式&#xff0c;毕业设计作品也是我们将来面试找工作的一个敲门砖。 选题前先看看自己掌握哪些技术点、擅长哪…

数据库常用的数据类型和约束条件

文章目录一. 数据库常用的数据类型1. 数字类型1.1 整数类型:INT(m)和BIGINT(m)1.2 浮点类型:DOUBLE(m,n)2. 字符类型2.1 定长字符:CHAR(n)2.2 变长字符:VARCHAR(n)2.3 变长字符:TEXT(n)3. 日期类型3.1 语法格式:3.2 注意事项二. 约束条件1.主键约束(PRIMARY KEY)1.1 注意事项1.…

[附源码]Python计算机毕业设计Django美发店会员管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Web压测工具http_load原理分析

01、前言 http_load是一款测试web服务器性能的开源工具&#xff0c;从下面的网址可以下载到最新版本的http_load&#xff1a; http://www.acme.com/software/http_load/ 这个软件一直在保持着更新&#xff08;不像webbench&#xff0c;已经是十年的老古董了。 webbench的源…

【Matplotlib绘制图像大全】(二十九):Matplotlib绘制热力图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

【经验分享】突然我的SM.MS的图床没法访问了(内附解决方法)

【经验分享】突然我的SM.MS的图床没法访问了&#xff08;内附解决方法&#xff09; 一大早写文章&#xff0c;发现Markdown里的图片全部都不能成功加载了&#xff0c;这个的确挺头疼的&#xff01; 文章目录1 说一说现象2 简单排查一下3 查找解决方案4 实施解决方案5 总结6 更多…

高楼扔鸡蛋问题

1.对应letecode链接 高楼扔鸡蛋问题 2.题目描述 解题思路 题目是这样&#xff1a;你面前有一栋从 1 到 N 共 N 层的楼&#xff0c;然后给你 K 个鸡蛋&#xff08;K 至少为 1&#xff09;。现在确定这栋楼存在楼层 0 < F < N&#xff0c;在这层楼将鸡蛋扔下去&#xff…

Windows使用ssh协议远程连接ubuntu linux子系统

Windows使用ssh协议远程连接ubuntu linux子系统一、Windows远程连接ubuntu linux子系统二、开启ubuntu ssh服务三、获取ubuntu子系统的ip地址四、从windows上通过ssh连接到ubuntu子系统五、后记一、Windows远程连接ubuntu linux子系统 当我们在windows上安装好ubuntu子系统后&…

Linux命令总结详细

Linux命令总结详细1.前言2.基础知识2.1.执行命令格式2.2.帮助命令2.2.1.man命令2.3.部分快捷键2.3.1.Tab键2.3.2.Ctrlc组合键2.3.3.Ctrll组合键2.4.服务运行命令2.5.服务开机启动命令3.系统工作命令3.1.date时间命令3.1.1.命令解释3.1.2.命令参数3.1.3.案例3.2.reboot重启命令3…

ESP-01S使用AT指令连接阿里云

这次分享下ESP8266-01S使用AT指令连接阿里云&#xff0c;为了后面stm32--esp-01s-阿里云&#xff08;MQTT&#xff09;做铺垫 目录 步骤&#xff1a; 1.烧录阿里云固件 首先我们打开->安信可官网下载阿里云的固件&#xff0c;如图 1.1串口助手与esp-01s接线说明 注&am…

C语言——VS2019实用调试技巧

前言 要想成为一个合格的程序员&#xff0c;不仅仅要会写代码&#xff0c;更要会调试代码。咔咔一通敲代码&#xff0c;敲出了BUG&#xff0c;这时就分两种程序员&#xff0c;一种是质疑编译器的程序员&#xff0c;“什么&#xff1f;我写出了BUG&#xff0c;是不是机器出了问…

什么是混淆矩阵精度、召回率、准确性、F1 分数、FPR、FNR、TPR、TNR?

在你的数据科学生涯的开始,混淆矩阵会非常混乱,我们会有很多问题,比如什么时候使用精度?什么时候使用召回?在哪些情况下可以使用精度?因此,我将尝试在本博客中回答这些问题。 什么是混淆矩阵? 混淆矩阵是一种将预测结果和实际值以矩阵形式汇总的方法,用来衡量分类问题…

带头双向循环链表的实现

目录前言节点声明链表的初始化尾插打印链表头插尾删头删查找节点指定位置插入指定位置删除链表销毁前言 之前讲过单链表的实现&#xff0c;在实现的过程中&#xff0c;我们会发现每次删除或者在前面插入节点的时候&#xff0c;都要提前保存上一个节点的地址。这样做十分麻烦&a…

大一新生HTML期末作业个人介绍博客 使用html+css+javascript+jquery技术制作网页,含有动画,hover效果,含有表格布局

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…