Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序对子串进行计数_C_String_Substring - Fatal编程技术网

C程序对子串进行计数

C程序对子串进行计数,c,string,substring,C,String,Substring,为什么我的程序总是跳过最后一个子串计数 eg1。字符串:dbdbsnasdb dbdxx 子字符串:db 计数:4(无错误) eg2。字符串:dbdbsnamfdb 子字符串:db 计数:2(应为3) **#仅包括 int countSubstr(char string[], char substring[]) { int i, j; int count = 0; int subcount = 0; for (i = 0; i <= strlen(strin

为什么我的程序总是跳过最后一个子串计数

eg1。字符串:
dbdbsnasdb dbdxx

子字符串:
db

计数:
4
(无错误)

eg2。字符串:
dbdbsnamfdb

子字符串:
db

计数:
2
(应为3)

**
#仅包括

int countSubstr(char string[], char substring[]) {
    int i, j;
    int count = 0;
    int subcount = 0;
    for (i = 0; i <= strlen(string);) {
        j = 0;
        count = 0;
        while ((string[i] == substring[j])) {
            count++;
            i++;
            j++;
        }
        if (count == strlen(substring)) {
            subcount++;
            count = 0;
        } else
            i++;
    }
    return subcount;
}
int countSubstr(字符字符串[],字符子字符串[]){
int i,j;
整数计数=0;
int subcount=0;

对于while循环中的(i=0;ifor(i=0;ifor(i=0;i),您没有检查是否超过字符串长度

编辑:
请记住,在C中,所有字符串的结尾都有一个“\0”,但在while循环中,您不会检查它

在您的特定示例中,我们得到(从最后一个db开始):
i=10,j=0,count=1(检查'd')
i=11,j=1,计数=2(检查“b”)
i=12,j=2,计数=3(检查'\0')
i=13,j=3,计数=3(退出循环)

count=3与strlen(子字符串)==2不同

->在while循环中,子计数没有增加,您没有检查是否超过字符串长度

编辑:
请记住,在C中,所有字符串的结尾都有一个“\0”,但在while循环中,您不会检查它

在您的特定示例中,我们得到(从最后一个db开始):
i=10,j=0,count=1(检查'd')
i=11,j=1,计数=2(检查“b”)
i=12,j=2,计数=3(检查'\0')
i=13,j=3,计数=3(退出循环)

count=3与strlen(子字符串)==2不同
->次计数不增加

  • 您的内部循环(
    while
    )可以继续比较任意字符串中的空终止符。 当其中一个字符串达到其终止的空字符时,您需要立即停止它
  • 您的外部循环条件有一个off by one错误。但无论如何,您不需要调用
    strlen
    。只需迭代,直到返回空字符
  • 您还可以将
    strlen(子字符串)
    移动到循环外部,以避免可能重新计算它
  • 更好的版本可能如下所示:

    int countSubstr(char string[], char substring[])
    {
        int subcount = 0;
        size_t sub_len = strlen(substring);
        if (!sub_len) return 0;
    
        for (size_t i = 0;string[i];) {
            size_t j = 0;
            size_t count = 0;
            while (string[i] && string[j] && string[i] == substring[j]) {
                count++;
                i++;
                j++;
            }
            if (count == sub_len) {
                subcount++;
                count = 0;
            }
            else {
                i = i - j + 1; /* no match, so reset to the next index in 'string' */
            }
        }
        return subcount;
    }
    
  • 您的内部循环(
    while
    )可以继续比较任意字符串中的空终止符。 当其中一个字符串达到其终止的空字符时,您需要立即停止它
  • 您的外部循环条件有一个off by one错误。但无论如何,您不需要调用
    strlen
    。只需迭代,直到返回空字符
  • 您还可以将
    strlen(子字符串)
    移动到循环外部,以避免可能重新计算它
  • 更好的版本可能如下所示:

    int countSubstr(char string[], char substring[])
    {
        int subcount = 0;
        size_t sub_len = strlen(substring);
        if (!sub_len) return 0;
    
        for (size_t i = 0;string[i];) {
            size_t j = 0;
            size_t count = 0;
            while (string[i] && string[j] && string[i] == substring[j]) {
                count++;
                i++;
                j++;
            }
            if (count == sub_len) {
                subcount++;
                count = 0;
            }
            else {
                i = i - j + 1; /* no match, so reset to the next index in 'string' */
            }
        }
        return subcount;
    }
    

    您的代码中存在一些问题:


    • (i=0;i的循环
      ,代码中存在一些问题:


      • 循环
        用于(i=0;i这适用于我测试的所有边缘情况

        #include <stdio.h>
        
        int countSubstr(char string[], char substring[])
        {
            int count = 0;
            size_t i = 0;
            while(string[i])
            {
                int match = 1;
                size_t j = 0;
                while (substring[j])
                {
                    match &= substring[j] == string[i + j];
                    j++;
                }
                count += match;
                i++;
            }
            return count;
        }
        

        这适用于我测试的所有边缘情况

        #include <stdio.h>
        
        int countSubstr(char string[], char substring[])
        {
            int count = 0;
            size_t i = 0;
            while(string[i])
            {
                int match = 1;
                size_t j = 0;
                while (substring[j])
                {
                    match &= substring[j] == string[i + j];
                    j++;
                }
                count += match;
                i++;
            }
            return count;
        }
        


        在第二个示例中,尾随的空字符也匹配,使计数比子字符串长度高出一个。但这段代码很糟糕,您走到了尽头-不要这样做。然后将
        strlen
        调用移出循环。可能
        else i++;
        的增量过大。我应该如何更改代码?不是吗在PHP中,在这样的循环中使用
        strlen()
        是可以的,但是理解了这一点,您永远不会这样做。相反,您应该检查
        '\0'
        终止符,如果您知道它,那么
        while((string[i]==substring[j])
        看起来也不对。使用
        子字符串:dd
        string:ddd
        的预期结果是什么?
        2
        1
        ?在第二个示例中,尾随的空字符也匹配,使计数比子字符串长度高一个。但此代码不好,您正在走到尽头-不要不要这样做。并将
        strlen
        调用移出循环。可能
        否则i++;
        的增量过大。我应该如何更改代码?请注意使用
        strlen()
        这样的循环在PHP中是可以的,但是理解了这一点,您永远不会这样做。相反,您应该检查
        '\0'
        终止符,如果您知道它,那么
        while((string[i]==substring[j]))
        对您来说也可能是错误的。
        字符串:ddd
        子字符串:dd
        的预期结果是什么?
        2
        1
        ?此程序的要求不允许我使用string.hAlso(我认为这不清楚)引用评论:string:ddd和substring:dd?2或1?…的预期结果是什么?我猜应该是1?–BEX您的代码返回
        2
        @BLUEPIXY:我修改了答案以澄清这一点。应该是1我猜很难作为规范;-)就我而言,countSubstr(“bbb”,“bb”)=1不正确。我认为这个答案比公认的答案好,但我个人不喜欢循环中断。这个程序的要求不允许我使用string.hAlso(我认为这不清楚)引用评论:string:ddd和substring:dd?2或1?…的预期结果是什么?我猜应该是1?–BEX您的代码返回
        2
        @BLUEPIXY:我修改了答案以澄清这一点。应该是1我猜很难作为规范;-)就我而言,countSubstr(“bbb”,“bb”)=1是不正确的。我认为这个答案比公认的答案好,但我个人不喜欢循环中断1)
        ){
        -->
        ){
        2)countSubstr(“ddb”,“db”)
        的结果是
        0
        ,而(string[I]
        是多余的,只是测试
        string[j]
        就足够了。空子字符串的大小写处理方式不同:
        countSubstr(“,”)
        可能会返回1,但您的代码有一个无限循环空子字符串的大小写处理方式不同:
        countSubstr(“,”)
        可能会返回1,但您的代码会返回0并有一个