在较大的字符串中查找子字符串(C)
我有一个程序,要求用户输入几个字符。我的程序有一个很大的字母数组,将对其进行搜索,以查看是否可以找到用户的输入。如果找到它,则将打印其值的索引。如果在数组中找到输入的多个副本,则将打印所有索引 有一个转折点,如果用户输入*字符,它可以被视为任何字母,将被忽略,例如AB*可以是ABA、ABB、ABC。。。等等 我有一个函数searchArray,它确定一个通配符*在较大的字符串中查找子字符串(C),c,string,C,String,我有一个程序,要求用户输入几个字符。我的程序有一个很大的字母数组,将对其进行搜索,以查看是否可以找到用户的输入。如果找到它,则将打印其值的索引。如果在数组中找到输入的多个副本,则将打印所有索引 有一个转折点,如果用户输入*字符,它可以被视为任何字母,将被忽略,例如AB*可以是ABA、ABB、ABC。。。等等 我有一个函数searchArray,它确定一个通配符* char* searchArray(char *DNA, char *string) { if (!*string)
char* searchArray(char *DNA, char *string)
{
if (!*string)
return NULL;
char *p1 = (char*)DNA;
while (*p1)
{
char *p1Begin = p1,
*p2 = (char*)string;
while ((*p1 && *p2 && *p1 == *p2) || *p2 == '*')
{
p1++;
p2++;
}
if (!*p2)
return p1Begin;
p1 = p1Begin + 1;
}
return NULL;
}
我在主程序中调用这个函数来比较字符串,然后如果字符串匹配,我将打印它所在位置的索引。但是,我似乎不能打印超过1个索引(如果有多个索引集,则不会打印)
下面的代码
- 简化逻辑
- 必须在findString的末尾有任何“通配符”
- 工作正常
- 使用可用的C库函数,特别是
strstr()
- 打印输出,每行一个条目
#include <stdio.h>
#include <string.h>
int main( void )
{
// DNA must be an array, not a pointer to an array
char DNA[] = { "zabcdefghijklmnab defghijk ab 123 ab" };
// findString must be an array, not a pointer to an array
char findString[] = {"ab*"};
// always a good idea to initialize variables on the stack
char *wildCard = NULL;
// Note following 'if' will not result in correct action if
// wildcard character not last in findString
if( ( wildCard = strstr( findString, "*") ) )
{ // then a trailing '*', so replace with NUL byte
*wildCard = '\0';
}
// get first possible pointer to where findString is in DNA string
char * result = strstr( result, findString );
while( result )
{ // then an instance of the findString found in DNA string
int position = result - DNA;
printf("Match found at element %d\n", position);
// Note: step over first byte of instance of findString
// may want to change +1 to length of original findString
result = strstr( result+1, findString );
}
return 0;
} // end function: main
#包括
#包括
内部主(空)
{
//DNA必须是数组,而不是指向数组的指针
char DNA[]={“zabcdefghijklmnab defghijk ab 123 ab”};
//findString必须是数组,而不是指向数组的指针
字符查找字符串[]={“ab*”};
//初始化堆栈上的变量总是一个好主意
char*通配符=NULL;
//注意:以下“如果”不会导致正确的操作,如果
//通配符在findString中不是最后一个
if((通配符=strstr(findString,“*”))
{//然后是尾随的“*”,因此替换为NUL字节
*通配符='\0';
}
//获取第一个可能的指针,指向findString在DNA字符串中的位置
char*result=strstrstr(结果,findString);
while(结果)
{//然后在DNA字符串中找到findString的一个实例
int位置=结果-DNA;
printf(“在元素%d\n”位置找到匹配项);
//注意:跳过findString实例的第一个字节
//可能需要将+1更改为原始findString的长度
结果=strstr(结果+1,findString);
}
返回0;
}//结束函数:main
以下代码
- 简化逻辑
- 必须在findString的末尾有任何“通配符”
- 工作正常
- 使用可用的C库函数,特别是
strstr()
- 打印输出,每行一个条目
#include <stdio.h>
#include <string.h>
int main( void )
{
// DNA must be an array, not a pointer to an array
char DNA[] = { "zabcdefghijklmnab defghijk ab 123 ab" };
// findString must be an array, not a pointer to an array
char findString[] = {"ab*"};
// always a good idea to initialize variables on the stack
char *wildCard = NULL;
// Note following 'if' will not result in correct action if
// wildcard character not last in findString
if( ( wildCard = strstr( findString, "*") ) )
{ // then a trailing '*', so replace with NUL byte
*wildCard = '\0';
}
// get first possible pointer to where findString is in DNA string
char * result = strstr( result, findString );
while( result )
{ // then an instance of the findString found in DNA string
int position = result - DNA;
printf("Match found at element %d\n", position);
// Note: step over first byte of instance of findString
// may want to change +1 to length of original findString
result = strstr( result+1, findString );
}
return 0;
} // end function: main
#包括
#包括
内部主(空)
{
//DNA必须是数组,而不是指向数组的指针
char DNA[]={“zabcdefghijklmnab defghijk ab 123 ab”};
//findString必须是数组,而不是指向数组的指针
字符查找字符串[]={“ab*”};
//初始化堆栈上的变量总是一个好主意
char*通配符=NULL;
//注意:以下“如果”不会导致正确的操作,如果
//通配符在findString中不是最后一个
if((通配符=strstr(findString,“*”))
{//然后是尾随的“*”,因此替换为NUL字节
*通配符='\0';
}
//获取第一个可能的指针,指向findString在DNA字符串中的位置
char*result=strstrstr(结果,findString);
while(结果)
{//然后在DNA字符串中找到findString的一个实例
int位置=结果-DNA;
printf(“在元素%d\n”位置找到匹配项);
//注意:跳过findString实例的第一个字节
//可能需要将+1更改为原始findString的长度
结果=strstr(结果+1,findString);
}
返回0;
}//结束函数:main
您的代码难以阅读。您应该更好地格式化它,缩进它,使用更好的名称,并在块周围使用{}。@falmari现在更好了吗?代码不会编译。发布真实代码。而(*p1&&*p2&&*p1==*p2)| |*p2='*')
是有问题的。可能而(*p1&&*p2&&(*p1==*p2 | |*p2=='*')
?不确定。注意:考虑变量名<代码> char *搜索字符串(conchch*Haistac,conchch**)< /C>。我发现这两个名字很容易理解。你的代码非常难读。您应该更好地格式化它,缩进它,使用更好的名称,并在块周围使用{}。@falmari现在更好了吗?代码不会编译。发布真实代码。而(*p1&&*p2&&*p1==*p2)| |*p2='*')
是有问题的。可能而(*p1&&*p2&&(*p1==*p2 | |*p2=='*')
?不确定。注意:考虑变量名<代码> char *搜索字符串(conchch*Haistac,conchch**)< /C>。我发现这两个名字很容易理解。