为什么我的 GeeksforGeeks 的 isSubstring 算法不工作是有原因的

is there a reason why my isSubstring algorithm from GeeksforGeeks isn't working

为什么我的 isSubstring 算法不起作用?它与此处提供的算法相同:https://www.geeksforgeeks.org/check-string-substring-another/ 但一直返回 2,即使它们在我眼中是相同的子字符串。

int main()
{
    char substring[] = "New York";
    char stringVal[] = "Joshua,New York,Engineer";
    int M = sizeof(substring);
    int N = sizeof(stringVal);
    #pragma clang loop unroll(full)
    for (int i = 0; i <= N - M; i++) {
        int j;

        for (j = 0; j < M; j++) {
            if (stringVal[i + j] != substring[j]){
                break;
            }
        }
 
        if (j == M) {
            printf("%d", 1);
            return 1;
        }
    }
    printf("%d", 2);
    return -1;
}

这些变量

int M = sizeof(substring);
int N = sizeof(stringVal);

计数也终止字符串的零。

因此在这个 for 循环中

    for (j = 0; j < M; j++) {
        if (stringVal[i + j] != substring[j]){
            break;
        }
    }

将字符串 substring 的终止零 '[=16=]' 与字符串 stringVal.

的非终止零字符进行比较

您需要排除终止零,例如

int M = sizeof(substring) - 1;
int N = sizeof(stringVal) - 1;

或者正如 Paul Sanders 指出的那样,使用标准 C 函数 strlen.

会更好
#include <string.h>

//...

int M = strlen(substring);
int N = strlen(stringVal);

你应该使用类型 size_t

而不是类型 int
#include <string.h>

//...

size_t M = strlen(substring);
size_t N = strlen(stringVal);

类型size_t是函数的return类型strlen和运算符的值的类型sizeof.