我有一个作业,我需要在我拥有的数组中找到子串。
这是我的阵列:
char DNA[] = {'A', 'G', 'C', 'G', 'G', 'G', 'A', 'C', 'C', 'G', 'T', 'C',
'C', 'C', 'G', 'A', 'C', 'A', 'T', 'T', 'G', 'A', 'T', 'G',
'A', 'A', 'G', 'G', 'G', 'T', 'C', 'A', 'T', 'A', 'G', 'A',
'C', 'C', 'C', 'A', 'A', 'T', 'A', 'C', 'G', 'C', 'C', 'A',
'C', 'C', 'A', 'C', 'C', 'C', 'C', 'A', 'A', 'G', 'T', 'T',
'T', 'T', 'C', 'C', 'T', 'G', 'T', 'G', 'T', 'C', 'T', 'T',
'C', 'C', 'A', 'T', 'T', 'G', 'A', 'G', 'T', 'A', 'G', 'A',
'T', 'T', 'G', 'A', 'C', 'A', 'C', 'T', 'C', 'C', 'C', 'A',
'G', 'A', 'T', 'G', '\0'};
用户将输入一个字符串,例如CAT,我需要制作一个程序,使printf语句显示找到CAT的元素。
我尝试使用strstr函数,但这只能让我第一次出现在数组中。但是,如果CAT出现不止一次,它就不会打印出那个声明,所以我想知道我该怎么做?
这是我到目前为止所做的:
char input [100];
char DNA[] = {'A', 'G', 'C', 'G', 'G', 'G', 'A', 'C', 'C', 'G', 'T', 'C',
'C', 'C', 'G', 'A', 'C', 'A', 'T', 'T', 'G', 'A', 'T', 'G',
'A', 'A', 'G', 'G', 'G', 'T', 'C', 'A', 'T', 'A', 'G', 'A',
'C', 'C', 'C', 'A', 'A', 'T', 'A', 'C', 'G', 'C', 'C', 'A',
'C', 'C', 'A', 'C', 'C', 'C', 'C', 'A', 'A', 'G', 'T', 'T',
'T', 'T', 'C', 'C', 'T', 'G', 'T', 'G', 'T', 'C', 'T', 'T',
'C', 'C', 'A', 'T', 'T', 'G', 'A', 'G', 'T', 'A', 'G', 'A',
'T', 'T', 'G', 'A', 'C', 'A', 'C', 'T', 'C', 'C', 'C', 'A',
'G', 'A', 'T', 'G', '\0'};
printf("enter string ");
scanf("%s", &input);
char *find;
find = strstr(DNA, input);
if (find != NULL)
{
printf("the string is found at element %d\n", (find - DNA)+1);
}
如果我键入CAT,程序将在元素17处说明,但在元素74处有另一个CAT。
答案 0 :(得分:1)
while循环足以完成此任务。
#include <stdio.h>
int main(void)
{
char input[100];
char DNA[] = {
'A', 'G', 'C', 'G', 'G', 'G', 'A', 'C', 'C', 'G', 'T', 'C',
'C', 'C', 'G', 'A', 'C', 'A', 'T', 'T', 'G', 'A', 'T', 'G',
'A', 'A', 'G', 'G', 'G', 'T', 'C', 'A', 'T', 'A', 'G', 'A',
'C', 'C', 'C', 'A', 'A', 'T', 'A', 'C', 'G', 'C', 'C', 'A',
'C', 'C', 'A', 'C', 'C', 'C', 'C', 'A', 'A', 'G', 'T', 'T',
'T', 'T', 'C', 'C', 'T', 'G', 'T', 'G', 'T', 'C', 'T', 'T',
'C', 'C', 'A', 'T', 'T', 'G', 'A', 'G', 'T', 'A', 'G', 'A',
'T', 'T', 'G', 'A', 'C', 'A', 'C', 'T', 'C', 'C', 'C', 'A',
'G', 'A', 'T', 'G', '\0'
};
printf("enter string : ");
scanf("%s", input);
char *ptr = DNA;
while( (ptr = strstr(ptr,input)) != NULL )
{
printf("the string is found at element %d\n", (ptr-DNA)+1);
ptr++;
}
}
答案 1 :(得分:0)
嗯,strstr()
参考文档说(强调我的):
在str指向的以null结尾的字节字符串中查找由substr指向的以null结尾的字节字符串的第一次出现。不比较终止空字符。 如果str或substr不是指向以null结尾的字节串的指针,则行为是未定义的。
因此,要查找更多事件,请在循环中使用结果指针+ 1重复调用strstr()
,直到它返回NULL
。
从您在评论中的请求中,可以找到所有出现的序列:
char *find = NULL;
char *start = DNA;
do {
find = strstr(start, input);
if (find != NULL) {
printf("the string is found at element %d\n", (find - start)+1);
start = find + 1;
}
} while(find != NULL);
答案 2 :(得分:0)
一种方法是将if语句更改为while循环,在每次迭代时修改find
。请注意,就像DNA
一样,find
也引用了一个字符指针 - 只是在字符串中的不同位置。因此,只需使用++find
作为起点即可访问字符串的其余部分。
while(find != NULL){
printf("the string is found at element %d\n", (find - DNA)+1);
find = strstr(++find, input);
}
这会产生相当粗略的输出,但它可以为您提供一些工作。
答案 3 :(得分:0)
我认为这就是你需要的:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void checkString(char *string1, char *string2){
char *s1, *s2, *s3;
size_t lenstring1 = strlen(string1);
size_t lenstring2 = strlen(string2);
if (lenstring2 < 1){
printf("There is no substring found");
exit(1);
}
size_t i=0,j=0;
int found=0;
s1 = string1;
s2 = string2;
for(i = 0; i < lenstring1; i++){
if(*s1 == *s2){
s3 = s1;
for(j = 0;j < lenstring2;j++){
if(*s3 == *s2){
s3++;s2++;
}else{
break;
}
}
s2 = string2;
if(j == strlen(string2)){
found = 1;
printf("%s found at index : %zu\n",string2,i+1);
}
}
s1++;
}
if(found == 0){
printf("No match Found");
}
}
int main(void){
char string1[] = {'A', 'G', 'C', 'G', 'G', 'G', 'A', 'C', 'C', 'G', 'T', 'C',
'C', 'C', 'G', 'A', 'C', 'A', 'T', 'T', 'G', 'A', 'T', 'G',
'A', 'A', 'G', 'G', 'G', 'T', 'C', 'A', 'T', 'A', 'G', 'A',
'C', 'C', 'C', 'A', 'A', 'T', 'A', 'C', 'G', 'C', 'C', 'A',
'C', 'C', 'A', 'C', 'C', 'C', 'C', 'A', 'A', 'G', 'T', 'T',
'T', 'T', 'C', 'C', 'T', 'G', 'T', 'G', 'T', 'C', 'T', 'T',
'C', 'C', 'A', 'T', 'T', 'G', 'A', 'G', 'T', 'A', 'G', 'A',
'T', 'T', 'G', 'A', 'C', 'A', 'C', 'T', 'C', 'C', 'C', 'A',
'G', 'A', 'T', 'G', '\0'};
char string2[] = "CAT";
checkString(string1, string2);
return 0;
}
输出:
CAT found at index : 17 CAT found at index : 31 CAT found at index : 74