2015-10-20 42 views
-3

我有一个任务,我需要在数组中找到子字符串。在字符数组中查找字符串值

这是我的数组:

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

+5

提示:如果你想一些事情发生不止一次,做一个循环。 – dasblinkenlight

+0

[删除数组中的重复字符串](http:// stackoverflow。com/questions/19960177/delete-duplicate-string-in-array) –

回答

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); 
} 

这产生了一个相当原始的输出,但它给了你一些工作。

0

好了,strstr()参考文档说(重点煤矿):

通过在空termina SUBSTR查找空终止字节串的第一次出现指向由str指向的字节串。不会比较终止的空字符。 如果str或substr不是指向以空字符结尾的字节字符串的指针,则行为未定义。

因此,要找到的再次发生,请致电strstr()多次与结果指针+ 1的循环,直到它返回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); 
+0

你能给我可能的伪代码吗?我是一个初学者编码器,所以我仍然有点困惑你的意思。就像我正在考虑一个循环,除了我似乎无法正确的。 –

+0

@ RayChen一些伪代码给你。 –

+0

感谢您的示例代码。现在在我的任务中,它指出*运算符被认为是“通配符”术语,可以是数组中的任何字母(A,G,T,C)。我如何将*字母设置为等于这4个字母中的任何一个,以便如果用户输入CA *,它可以被认为是CAT,CAG,CAC,CAA? –

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++; 
    } 
} 
+0

你甚至试过这个吗? – Michi

+0

我did.Why怎么了? –

+0

顺便说一句,你应该检查scanf的错误和**%d ** si错误,应该是**%ld **因为**(ptr-DNA)+1)**是long int not int .. – Michi

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 
+0

感谢michi,虽然我不知道如何解释你的代码。 (即时新手,所以我的知识是相当有限的。 –

+0

这不是一个没有任何努力发布相同的问题的理由。 – Useless