C中一个字符串在另一个字符串中出现的次数

时间:2015-10-07 16:39:28

标签: c string

我编写了一个函数,它使用strstr()函数来确定string2是否在string1中有任何匹配项。这工作正常(我还将两个字符串转换为小写,以便我可以进行不区分大小写的匹配。)。但是,strstr()仅查找匹配发生的第一个时间。有没有办法用它来查找匹配发生的每个时间?例如:

class cr {
    private $priv_member;
    function cr($val)
    {$this->priv_member = $val;}
    static function comp_func_cr($c2, $c1)
    {if ($c2->priv_member === $c1->priv_member) return 0;
        return ($c2->priv_member > $c1->priv_member)? 1:-1;}}

如果在位置0找到匹配,则返回0,在位置6再次找到6,会返回6吗?

这里写的是原始函数(包括在main中调用函数):

string1[] = "ABCDEFABC";
string2[] = "ABC";

2 个答案:

答案 0 :(得分:3)

鉴于

library(dplyr)
library(ggplot2)

df_max <- df %>%
  group_by(Color, Shape) %>%
  slice(which.max(Freq))

head(df_max)
# Source: local data frame [4 x 4]
# Groups: Color, Shape [4]
# 
#    Color    Shape   Size  Freq
#    (chr)    (chr)  (chr) (int)
# 1    Red   Square Medium     6
# 2    Red Triangle    Big    12
# 3 Yellow   Square    Big    10
# 4 Yellow Triangle  Small     8

ggplot(df_max, aes(x = Color, y = Shape, fill = Size)) +
  geom_tile()

char string1[] = "ABCDEFABC"; char string2[] = "ABC"; 将返回指向strstr(string1, string2)的第一个元素的指针。

  

如果在位置0找到匹配,则返回0,在位置6再次找到6,会返回6吗?

为了检查string1string2的多次出现,您必须多次拨打string1并且偏离strstr。 E.g。

string1

答案 1 :(得分:2)

我认为这就是你所需要的:

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

int main(void){
    char string1[] = "ABCDABCEFABC";
    char string2[] = "ABC";
    char *s1, *s2, *s3;

    size_t lenstring1 = strlen(string1);
    size_t lenstring2 = strlen(string2);

    if (lenstring2 < 1){
        printf("There is no substring found"); /* or what ever */
        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");
    }

    return 0;
}

输出:

ABC found at index : 1
ABC found at index : 5
ABC found at index : 10

如果 string2 为空,您将获得:

  

找不到子字符串