【问题标题】:is there a reason why my isSubstring algorithm from GeeksforGeeks isn't working我的 GeeksforGeeks 的 isSubstring 算法不起作用有什么原因吗
【发布时间】:2021-10-10 22:26:47
【问题描述】:

我的 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;
}

【问题讨论】:

  • 它怎么可能返回 2?根据代码,此函数返回 1 或 -1。 ?????
  • @BobJarvis:我猜 OP 的意思是“打印”而不是“返回”。但是,OP 应该在问题中澄清这一点。

标签: c algorithm for-loop substring c-strings


【解决方案1】:

这些变量

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

计数也终止字符串的零。

因此在这个 for 循环中

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

将比较字符串substring 的终止零'\0' 与字符串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是函数strlen的返回类型和运算符sizeof的值类型。

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多