查找Char数组

时间:2015-10-20 19:21:45

标签: c arrays char

我有一个作业,我需要在我拥有的数组中找到子串。

这是我的阵列:

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。

4 个答案:

答案 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