C语言 在字符串1中找字符串2首次出现的位置(strstr的缩减版)

2023-05-16

 

 

目录

题目

一、想法

二、实现代码

1.‘strstr’函数部分

注意点

2.main函数部分

3.完整代码

总结

 


题目

描述

        编写一个函数,函数的目的是在字符串1中找字符串2首次出现的位置; 

输入

        分为两行,第一行为一个字符串1,母字符串str1,第二行为一个字符串2,子字符串str2

输出

        输出一行,为一个整数,输入str2在str1中首次出现的位置(str2的首字母在str1中的位置),若未出现,则输出-1

样例输入

#example1

The quick brown dog jumps over the lazy fox

lazy

#example2

I am a good student

teacher

样例输出 

#answer1

36

#answer2

-1


 

一、想法

        不知道各位看完题目的第一想法是什么,但是笔者作为一个刚学c语言1个月的普通学生,想到的是函数strstr

如下是strstr函数的定义

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;
否则,返回NULL。

        其实不难看出,本题目是strstr函数的一个缩减版,只需要我们判断str2是否在str1中出现,和初次出现的位置。鉴于此,笔者就使用strstr来暂时代替此题目的函数。

        而笔者的知识储备很差,这里就用最基础的方法即从str1的第一位开始,一位一位的对比,判断str2是否出现,虽然方法很笨,但是最后也是实现了目的,且自认为思路是清晰的。

        请看代码

二、实现代码

1.‘strstr’函数部分

int strstr(char* str1, char* str2)
{
	int location;
	int locate = 1;
	char* copy; copy = str2;
	int num=0;
	while (*str1 != '\0')
	{
		copy = str2;
		num = 0;//num的实质是str2的长度
		while (*str1 == *copy)//判断是否重复出现
		{
			copy++;
			str1++; 
			locate++;
			num++;
		}
		if (*copy  == '\0')//str2已经完整出现
			break;
		if (num != 0) continue;//若可以循环locate和str1会加一,则不用再加
		str1++; locate++;
	}
	if (*copy != '\0')location = -1;//str2未出现
	else location = locate - num;//循环终止的位置减去str2的长度
	return location;
}

注意点

if (num != 0) continue;

此处必须加上此代码,否则会继续执行接下来的

str1++; locate++;

造成str1和locate多加了一次,导致结果错误

此处应该是可以简化的,但无奈笔者才疏学浅(其实是为了复习高数A的半期考试不想在动脑筋了) ,没法简化,若是读者有想法请在评论区打出,谢谢!

2.main函数部分

这部分就是基础的输入str1,str2两个字符串和应用函数了

int main()
{
	int locate;
	char str1[256]={'\0'}, str2[256] = {'\0'};
	gets_s(str1);	gets_s(str2);
	locate=strstr(str1, str2);
	printf("%d", locate);
    return 0;
}

3.完整代码

#include<stdio.h>
int strstr(char* str1, char* str2)
{
	int location;
	int locate = 1;
	char* copy; copy = str2;
	int num=0;
	while (*str1 != '\0')
	{
		copy = str2;
		num = 0;//num的实质是str2的长度
		while (*str1 == *copy)//判断是否重复出现
		{
			copy++;
			str1++; 
			locate++;
			num++;
		}
		if (*copy  == '\0')//str2已经完整出现
			break;
		if (num != 0) continue;//若可以循环locate和str1会加一,则不用再加
		str1++; locate++;
	}
	if (*copy != '\0')location = -1;//str2未出现
	else location = locate - num;//循环终止的位置减去str2的长度
	return location;
}
int main()
{
	int locate;
	char str1[256]={'\0'}, str2[256] = {'\0'};
	gets_s(str1);	gets_s(str2);
	locate=strstr(str1, str2);
	printf("%d", locate);
}

 


总结

        实际上是一道十分简单的题目,只需要基础的循环控制和一点点入门指针的知识,虽然简单,但在处理过程中有涉及到了一些细节,十分有趣。

        本题目实际上来自笔者课程的一道题目,感觉颇有趣味故记录在此,如若读者您觉得有用,那我自然觉得分外高兴,若是没有,则不妨一笑而过,抱歉耽误您的几分钟

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 在字符串1中找字符串2首次出现的位置(strstr的缩减版) 的相关文章

  • Linux当中的压栈和出栈指令以及跳转指令详细教程

    1 跳压栈出栈指令 xff1a 我们通常会在 A 函数中调用 B 函数 xff0c 当 B 函数执行完以后再回到 A 函数继续执行 要想 再跳回 A 函数以后代码能够接着正常运行 xff0c 那就必须在跳到 B 函数之前将当前处理器状态保存
  • MySQL5.7版本在Ubuntu(WSL环境)系统安装

    课程中配置的WSL环境是最新的Ubuntu22 04版本 xff0c 这个版本的软件商店内置的MySQL是8 0版本 所以我们需要额外的步骤才可以安装5 7版本的MySQL 安装操作需root权限 xff0c 你可以 xff1a 通过 su
  • 动态库静态库的区别

    1 制作过程 静态库 xff1a 生成 o文件后 ar rcs o libxxx a 动态库 xff1a 生成 o文件时 xff0c 静态库是 c选项 xff0c 而动态库是 fpic FPIC xff0c 因为动态库需要生成与位置无关的代
  • 怎么把PWM信号转为模拟量

    有一个测量位置变化的位置传感器 xff0c 用万用表电压档测量传感器的输出信号 xff0c 结果显示的是模拟量信号 xff0c 即位置和信号输出大小呈线性关系 但是 xff0c 用示波器 xff08 Picoscope 4227 xff09
  • STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过,均为工程文件格式,可直接编译使用

    STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过 xff0c 均为工程文件格式 xff0c 可直接编译使用 该程序为大数据量吞吐的串口收发例程 xff0c 中断接收 xff0c 边
  • C语言中的函数返回值、return用法、return 0详解

    1 函数返回值 定义 xff1a 函数的返回值是指函数被调用之后 xff0c 执行函数体中的代码所得到的结果 xff0c 这个结果通过return语句返回 没有返回值的函数为空类型 xff0c 用void表示 一旦函数的返回值类型被定义为
  • TCP协议

    TCP xff08 Transmission Control Protocol xff09 是面向连接的可靠的通讯协议 TCP需要经过三次握手建立连接 xff0c 并在断开时通过四次挥手释放连接 TCP通过应答确认 超时重传 xff08 R
  • UART&RS232&RS485的区别

    UART RS232 RS485在串口通信中 xff0c 主要区别是电平的不同 xff0c 其中UART通常使用TTL电平 TTL TTL全名是晶体管 晶体管逻辑集成电路 Transistor Transistor Logic 输入高电平最
  • 思岚雷达rplidar S1配置调试全纪录

    耗时10天 xff0c 终于从零开始用QT在Ubuntu系统下完成了一个雷达避障系统的设计 xff0c 这文章的主要目的是将配置的流程和遇到的问题记录下来 xff0c 以供自己以后遇到一样的问题时可以有个参考 一 思岚雷达的配置 1 配置的
  • 学习 C++ 到底有什么好处?

    学C 43 43 本身是教不会你编程的 你需要主动的 不断的扩展自己的知识领域 写一个学生管理系统是一个很好的开端 xff1b 但接下来 xff0c 你还需要学习更多 举例来说 xff0c 图形界面 究竟是怎么一回事呢 xff1f 我们知道
  • c++中的二分查找算法

    二分查找普通模式 模板公式 xff1a while l lt 61 r mid 61 l 43 r 2 l 61 mid 43 1 else r 61 mid 1 二分查找特殊情况1 xff1a 000011111求第一个1 while l
  • liunx使用math.h头文件报错解决办法

    在liunx操作系统中 xff0c 编译的时候用到了math h或cmath头文件时 xff0c 一定要主动连接静态库 比如在vim中 xff0c 给编译的文件名后加 lm 否则会报错误
  • 基于AlexNet卷积神经网络的手写体数字倾斜校正系统研究-附Matlab代码

    目 录 一 引言 二 AlexNet 网络 三 实验验证 3 1 实验数据集 3 2 数据训练 3 3 手写体倾斜数字校正结果 四 参考文献 五 Matlab代码获取 一 引言 手写体数字识别是光学字符识别 Optical Characte
  • Jetson Nano 4GB 要怎么供电? Jetson Nano 2GB呢?

    Jetson Nano 4GB 常使用的电源连接方式有两种 xff1a 1 DC Power Jack 5 5 2 1mm 5V 4A xff0c 需使用跳帽将脚位 J48 短路 图一红框处 xff0c 电源连接方式请参照图一蓝框处 若一切
  • 毕业设计 基于单片机的导盲拐杖设计(源码+硬件+论文)

    文章目录 0 前言1 主要功能2 硬件设计 原理图 3 核心软件设计4 实现效果5 最后 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统的毕设题目缺少创新和亮点 xff0c 往往达不到毕业答辩的要
  • 毕业设计 基于stm32与openmv的目标跟踪系统

    文章目录 0 前言课题简介设计框架3 硬件设计4 软件设计 对被测物体的识别 判断被测物体所在区域 5 最后 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统的毕设题目缺少创新和亮点 xff0c 往
  • Qt中的TCP通信

    一 TCP的特点 TCP xff08 传输控制协议 xff09 是一种面向连接的 xff0c 可靠的 xff0c 基于字节流的传输层通信协议 二 TCP适合应用的场景 TCP协议适用于要求可靠传输的应用 xff0c 例如文件传输 xff0c
  • SQL常用语句大全

    我们在进行开发工作时 xff0c 对数据库的操作是必不可少的 xff0c 熟练掌握SQL语句可以让我们对数据库的数据处理变得非常简单 xff0c 所以学习SQL语句是非常有必要的 xff0c 下面汇总了一些常用的SQL语句 SQL语句的类型
  • VS配置Qt环境

    前言 Qt程序的开发不仅可以使用原生的Qt Creator xff0c 也可以使用Visual Studio 想使用VS进行Qt程序的开发 xff0c 需要安装Qt的插件 xff0c 下面看详细步骤 下载Qt的插件 地址 xff1a htt
  • STM32官方标准固件库开发与寄存器开发的区别

    一句话概括关系 xff1a 固件库就是函数的集合 xff0c 固件库函数的作用就是 xff1a 向下负责与寄存器直接打交道 xff0c 向上提供用户函数调用的接口 xff08 API xff09 对于STM32这种级别的MCU xff0c

随机推荐

  • CMake获取目录下所有源文件

    1 aux source directory指令 aux source directory lt dir gt lt variable gt 比如 xff1a aux source directory CMAKE CURRENT SOURC
  • Qt制作视频播放器

    前言 该播放器参考了SMPlayer xff0c 实现了其基础功能 xff0c 许多高级功能暂未实现 软件的实现基于Qt xff0c opencv xff0c 多线程以及数据库等相关知识 功能概述 支持本地音视频在线播放 xff0c url
  • Qt中QString与String的互相转换

    前言 Qt中的一些类型是Qt自己封装的 xff0c 例如我们平常常见的String在Qt中就是QString xff0c 但是有时我们调用第三方库时 xff0c 参数要求是String xff0c 这时我们就需要把QString转换成Str
  • Mat与QImage互相转换

    前言 Mat是opencv中的存储图像的容器 xff0c 也是图像像素矩阵 QImage是Qt中存储图片常用的类 Qt和opencv经常配合在一起使用 xff0c 但Qt的函数方法的参数是不接受Mat的 xff0c 所以如果我们想要在Qt中
  • CentOS7下安装libevent

    前言 CentOS7下安装libevent网络库 步骤 创建一个文件夹libevent xff08 方便后期维护管理 xff09 mkdir libevent 官网下载源码包 可以在本机下载然后文件传输 xff0c 也可以直接在linux下
  • Libevent源码深度剖析-张亮(转载)

    https blog csdn net xp178171640 article details 105490027
  • Qt6.4.3编译MySQL驱动

    前段时间电脑坏了重装了操作系统 软件都不能正常运行 大部分都得重装 本来用的Qt5 14 2 想着Qt都出6了 那就用用Qt6吧 Qt6想用mysql数据库也是得自己编译驱动的 但Qt6也是想推广CMake 所以我以前Qt5那一套编译mys
  • keil5中如何在一个项目中新建源文件

    哈喽哈喽 xff0c 昨天在学习如何点灯的时候接触到可以在一个已经建立好的项目中 xff0c 建立一个新的源文件写一个新的代码 这里就总结一下 点开file选择new xff0c 就会发现右边多个栏就说明源文件多了一个 xff0c 这个时候
  • 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因 xff0c 需要用到Python模拟登录网站 xff0c 但是以前对这块并不了解 xff0c 而且目标网站的登录方法较为复杂 xff0c 所以一下卡在这里了 xff0c 于是我决定从简单的模拟开始 xff0c 逐渐深入地研
  • 【VSCode】C++环境配置(小白必看)

    关于VSCode的c 43 43 环境配置 网上教程很多 xff0c 但大多是入门的新手小白难以理解 xff0c 操作不来的 xff0c 作者本人也是捣鼓了很久才配置好c 43 43 运行环境 本篇文章会从头到尾简述 一下vscode配置c
  • at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式

    at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式 半导体制冷片模拟除湿制冷 超声波雾化模块加湿 温湿度传感器检查环境温湿度 LCD液晶屏显示系统工作状态 全套包括实物成品 xff0c 原
  • Java常用类 - String类详解

    Java常用类 String类 创建字符串 xff1a 每个双引号括起来的字符串常量都是String类的一个实例 xff1b 也可以new 连接字符串 xff1a 43 xff1b string1 concat string2 span c
  • 如何利用#将宏定义中的参数插入到字符串中?

    首先明白几个原理 xff1a 在宏定义中 xff0c 如果宏参数为字符串 xff0c 可以把这个字符串放到字符串中 xff0c 但如果宏参数为变量的话就不可以 可以把宏定义中的参数转化为相应的字符串 xff0c 这时就可以把这个参数放到字符
  • ssmJavaEE无人机数据管理系统 毕业设计源码111022

    ssm无人机数据管理系统 摘 要 随着互联网趋势的到来 xff0c 各行各业都在考虑利用互联网将自己推广出去 xff0c 最好方式就是建立自己的互联网系统 xff0c 并对其进行维护和管理 在现实运用中 xff0c 应用软件的工作规则和开发
  • 【C语言】字符串函数strcat即自主实现

    目录 一 strcat函数 二 自主实现strcat 一 strcat函数 1 功能 xff1a 连接字符串 将源字符串的副本追加到目标字符串 目标中的终止空字符被源的第一个字符覆盖 xff0c 并在目标中两者的连接形成的新字符串的末尾包含
  • 2023版Postman接口测试使用全指南(原来使用 Postman测试API接口如此简单)

    下面是一篇详细介绍postman接口测试的文章 xff0c 如果文章内容不太明白的话 xff0c 我建议看看视频版本 xff0c 更加清洗 xff0c 更加直观 xff01 最详细的postman接口测试实战教程 哔哩哔哩 bilibili
  • Qt QDebug格式输出、自定义类输出及重定向输出Log

    1 qDebug 格式化输出 qDebug格式化支持printf的格式化标识符 如果向函数传递格式字符串和参数列表 xff0c 它的工作方式类似于C printf 函数 格式应该是Latin 1字符串 格式化demo 代码如下 xff08
  • Qt读取GPS数据

    1 型号版本 GPS型号为ublox xff08 EVK M8L xff09 xff0c 配有USB接口 xff0c Qt版本5 7 2 实现步骤 xff1a 1 实现串口通信 采用Qt5 7 内置的串口操作类QSerialPort和QSe
  • 解决问题备忘:Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》

    环境 xff1a php7 3 4nts lt php 新手 xff0c 不会较为规范的代码 xff0c 如下 xff1a header 34 Access Control Allow Origin 34 openid 61 empty G
  • C语言 在字符串1中找字符串2首次出现的位置(strstr的缩减版)

    目录 题目 一 想法 二 实现代码 1 strstr 函数部分 注意点 2 main函数部分 3 完整代码 总结 题目 描述 编写一个函数 xff0c 函数的目的是在字符串1中找字符串2首次出现的位置 xff1b 输入 分为两行 xff0c