C 获取字符串中子字符串的所有发生次数的所有索引

C 获取字符串中子字符串的所有发生次数的所有索引,c,C,我在网上到处搜索,但找不到可以在代码中实现的解决方案,我有一些限制因素要考虑,最大的一个是:我不能使用指针来做这件事,第二个是我不能在注释之前编辑 我要做的是在adn1字符串中查找SEC_B序列,然后将其位置保存到int数组中,然后像这样打印: Found sequence GTC in: 20 62 69 159 167 196 是的,我确实是手工数的 我必须对其他序列做同样的处理,但这并不重要,只要我能使它与一个序列一起工作,我就能使它与所有其他序列一起工作 这是我的代码: #inclu

我在网上到处搜索,但找不到可以在代码中实现的解决方案,我有一些限制因素要考虑,最大的一个是:我不能使用指针来做这件事,第二个是我不能在注释之前编辑

我要做的是在
adn1
字符串中查找
SEC_B
序列,然后将其位置保存到int数组中,然后像这样打印:

Found sequence GTC in:  20 62 69 159 167 196
是的,我确实是手工数的

我必须对其他序列做同样的处理,但这并不重要,只要我能使它与一个序列一起工作,我就能使它与所有其他序列一起工作

这是我的代码:

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

#define SECUENCIA0 "TGGCGTTTGCAGATTACTGCGTCCCTCACAAGGGTGTGAA"
#define SECUENCIA1 "GCTGTGCATTCGCGGCACAAGAGTCCCGGGTCCCTGTAGC"
#define SECUENCIA2 "TTCACCATCCTGTTGTACCTATCAAACCTACCTACAGCTT"
#define SECUENCIA3 "AGTGAAGGATTATGCGATTGGCGAGCATAGTACCGGCCCG"
#define SECUENCIA4 "TCACACCGTCTCATTGGTGGCCGACCTTGGAACTCCGTCA"
#define SEC_B "GTC"
#define SEC_D "GAT"
#define SEC_K "GT"

int main()
{
    char adn1[201];
    adn1[0]='\0';
    strcat(adn1,SECUENCIA0);
    strcat(adn1,SECUENCIA1);
    strcat(adn1,SECUENCIA2);
    strcat(adn1,SECUENCIA3);
    strcat(adn1,SECUENCIA4);
    //edit from here
    return 0;
}
#包括
#包括
#包括
#定义SECUENCIA0“TGGCGTTTGCAGATTACTGCGTCCCTCAAGGGGTGAA”
#定义第1节“GCTGTGCATTCGCGCACAGAGGTCCCGGGTCTCTCTGTAGC”
#定义SECUENCIA2“ttcaccctgttgtactatcaaacctacctacctaccatctt”
#定义SECUENCIA3“AGTGAGGAGGATTGCGATTGCGAGCATAGACCGGCCCG”
#定义第4节“TCACACGCTCTCATGGTGGCCGACCTTGGAACTCCGTCA”
#定义第B节“GTC”
#定义第二节“GAT”
#定义第K节“GT”
int main()
{
char-adn1[201];
adn1[0]='\0';
strcat(adn1,SECUENCIA0);
strcat(adn1,SECUENCIA1);
strcat(adn1,SECUENCIA2);
strcat(adn1,SECUENCIA3);
strcat(adn1,SECUENCIA4);
//从这里编辑
返回0;
}

就这么简单:

#包括
#包括
#包括
无效打印索引子字符串(常量字符*str,常量字符*substr)
{
字符*pstr;
printf(“索引:{”);
for(pstr=(char*)str;(pstr=strstrstr(pstr,substr))!=NULL;pstr=&pstr[1])
printf(“%lu,”,(uintpttr_t)pstr-(uintpttr_t)str);
printf(“}\n”);
}
基本上,函数
strstrstr
返回指向“str”中第一个出现的“substr”的指针,如果没有出现,则返回NULL。我们可以在for循环中使用这个指针,索引将是
pstr
-
str
,正如您在上面的函数中看到的那样。例如:

intmain()
{
const char my_string[]=“ABCDABCD”;
打印索引子字符串(我的字符串“ABCD”);
返回0;
}
输出:

Indices: { 0, 4, }

这个解决方案不涉及任何明确的指针(没有*任何地方),也不编辑注释上方的行,多亏了zazz的答案(他出于某种原因删除了该答案),我才想出了这个解决方案,以下是我的做法

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

#define SECUENCIA0 "TGGCGTTTGCAGATTACTGCGTCCCTCACAAGGGTGTGAA"
#define SECUENCIA1 "GCTGTGCATTCGCGGCACAAGAGTCCCGGGTCCCTGTAGC"
#define SECUENCIA2 "TTCACCATCCTGTTGTACCTATCAAACCTACCTACAGCTT"
#define SECUENCIA3 "AGTGAAGGATTATGCGATTGGCGAGCATAGTACCGGCCCG"
#define SECUENCIA4 "TCACACCGTCTCATTGGTGGCCGACCTTGGAACTCCGTCA"
#define SEC_B "GTC"
#define SEC_D "GAT"
#define SEC_K "GT"

int main()
{
    char adn1[201];
    adn1[0]='\0';
    strcat(adn1,SECUENCIA0);
    strcat(adn1,SECUENCIA1);
    strcat(adn1,SECUENCIA2);
    strcat(adn1,SECUENCIA3);
    strcat(adn1,SECUENCIA4);
    //edit below here
    printf("---- Búsqueda de secuencias B, D y K dentro del adn1 ------\n");
    int PosicionesB[20];
    int bs = 0;
    int i, l1, l2;
    l1 = strlen(adn1);
    l2 = strlen(SEC_B);
    for(i = 0; i < l1 - l2 + 1; i++) {
        if(strstr(adn1 + i, SEC_B) == adn1 + i) {
            PosicionesB[bs] = i;
            bs++;
            i = i + l2 -1;
        }
    }
    printf("Found sequence GTC in:");
    for(int i = 0; i < bs;i++){
       printf("  %d",PosicionesB[i]);
    }
    return 0;
}
#包括
#包括
#包括
#定义SECUENCIA0“TGGCGTTTGCAGATTACTGCGTCCCTCAAGGGGTGAA”
#定义第1节“GCTGTGCATTCGCGCACAGAGGTCCCGGGTCTCTCTGTAGC”
#定义SECUENCIA2“ttcaccctgttgtactatcaaacctacctacctaccatctt”
#定义SECUENCIA3“AGTGAGGAGGATTGCGATTGCGAGCATAGACCGGCCCG”
#定义第4节“TCACACGCTCTCATGGTGGCCGACCTTGGAACTCCGTCA”
#定义第B节“GTC”
#定义第二节“GAT”
#定义第K节“GT”
int main()
{
char-adn1[201];
adn1[0]='\0';
strcat(adn1,SECUENCIA0);
strcat(adn1,SECUENCIA1);
strcat(adn1,SECUENCIA2);
strcat(adn1,SECUENCIA3);
strcat(adn1,SECUENCIA4);
//在这里编辑下面的内容
printf(“Búsqueda de secuencias B,D y K dentro del adn1-----\n”);
int PosicionesB[20];
int-bs=0;
inti,l1,l2;
l1=strlen(adn1);
l2=斯特伦(第二节);
对于(i=0;i
:自己做一次真正的尝试,展示代码,问一个具体的问题。下次我会记住这一点,老实说,我会发布我的尝试,但它有点糟糕,完全没有做任何我想做的事情。这将非常有效,如果我能使用指针,我在问题中指定我不能使用指针,然而,另一个之前发布过删除答案的用户(名字是zazz)给了我一个部分解决方案,我设法想出了我自己的解决方案来计算发生率并存储它找到的子字符串的索引,我现在就发布答案,你什么意思你不能使用指针?字符串本身就是指针(const char*)。如果不是这样,你会做完全相同的思考,除了不用
strstr
你自己做比较,仍然使用指针来知道你在字符串中的位置。我们使用的是字符数组\0终止而不是常量字符*看看我刚刚发布的解决方案,老实说,如果我可以使用字符串作为const char*的话,我的生活会变得更加轻松。char[]只是一个指向具有定义大小的缓冲区的指针,这并不重要。还有,“没有显式指针”有什么意义?函数
strstr
将两个指针作为参数,并返回一个指针。如果您将我的函数复制到另一个文件中,您可以调用它并说它也不使用任何显式指针。仅仅因为你没有输入它们,并不意味着它们不在那里。你的“*”键坏了还是怎么了?嘿,这些都是给我的限制,我真的无能为力,如果是我,我会使用你的解决方案,他们在pdf中明确表示,不存在任何*指针定义如果它不涉及指针,那么
strstr
返回什么?不涉及任何显式指针,基本上,如果它是指针作为返回,这很好,但我自己不能定义任何指针,所以没有带*