我制作了一个模拟为函数strstr
库的程序string.h
。通过键盘输入 2 个字符串,该函数在第一个字符串中找到第二个字符串,返回一个指向NULL
第一个字符串(找到第二个字符串的位置)的指针(如果未找到,则返回 )。
我不知道如何在不修改原始字符串的情况下执行该功能。当函数返回“指针”(返回的指针类型char
)main
并自动修改原始字符串时,我不希望这样。
我希望我很清楚,非常感谢你提前。
#include <stdio.h>
#include <stdlib.h>
#define TAM 30
char* mistrstr(const char*,const char*);
int main()
{
char cadena[TAM];
char cadena1[TAM];
char *aparicion;
printf("Ingrese la primer cadena:");
gets(cadena);
fflush(stdin);
printf("Ingrese la segunda cadena:");
gets(cadena1);
fflush(stdin);
aparicion=mistrstr(cadena,cadena1);
printf("Primera aparicion (con mi funcion):%s\n",aparicion);
return 0;
}
/////////////////////////////////////////////////////
char* mistrstr(const char* cadena,const char* cadena1)
{
int i=-1;
char *apuntador,*cad,*cad1;
apuntador=cadena;
cad=(char*)cadena;
cad1=(char*)cadena1;
while(*cad)
{
if(*cad1==*cad)
i=0;
else
cad++;
while(i>=0)
{
*(apuntador+i)=*cad;
i++;
cad++;
if(*cad=='\0')
{
*(apuntador+i)='\0';
return apuntador;
}
}
}
return NULL;
}
////////////////////////////////////////////////
根据定义,字符串以空字符结尾。
该函数
strstr
所做的是返回一个指向子字符串所在位置的指针......但它不会修改原始字符串:此示例将返回:
考虑到这一点,函数所做的就是迭代,
cadena
并且在每次迭代时,检查它是否找到subcadena
:现在,如果您想要让您的函数在找到子字符串时返回子字符串(以 结尾
'\0'
),那么您没有太多选择:subcadena
。从技术上讲,这是您想要返回的内容,您不需要修改任何内容。cadena
. 可行且简单,但您不想这样做。如果您没有详细说明您的期望,我的回答到此结束。我的观点是,你想要的是不必要和人为的(如果你创建一个函数来搜索子字符串,你感兴趣的是知道它是否被找到以及在哪里......检索子字符串是荒谬的,因为它是你已经存储在子字符串本身中)。