在较大的字符串中查找子字符串(C)

在较大的字符串中查找子字符串(C),c,string,C,String,我有一个程序,要求用户输入几个字符。我的程序有一个很大的字母数组,将对其进行搜索,以查看是否可以找到用户的输入。如果找到它,则将打印其值的索引。如果在数组中找到输入的多个副本,则将打印所有索引 有一个转折点,如果用户输入*字符,它可以被视为任何字母,将被忽略,例如AB*可以是ABA、ABB、ABC。。。等等 我有一个函数searchArray,它确定一个通配符* char* searchArray(char *DNA, char *string) { if (!*string)

我有一个程序,要求用户输入几个字符。我的程序有一个很大的字母数组,将对其进行搜索,以查看是否可以找到用户的输入。如果找到它,则将打印其值的索引。如果在数组中找到输入的多个副本,则将打印所有索引

有一个转折点,如果用户输入*字符,它可以被视为任何字母,将被忽略,例如AB*可以是ABA、ABB、ABC。。。等等

我有一个函数searchArray,它确定一个通配符*

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>。我发现这两个名字很容易理解。