3

我正在将 C 中的字符串用作字符数组,并且我试图确保我可以动态地将值传递到我的 for 循环中。

以下代码有效,没问题:

for (int i = -6; i < 11; i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}

事实上,这段代码也有效:

for (int i = -strlen(fragments[2]) + 1; i < 11; i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}

但由于某种原因,这段代码不打印任何东西:

for (int i = -strlen(fragments[2]) + 1; i < strlen(fragments[1]); i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}

我已经检查了这两个值-strlen(fragments[2]) + 1strlen(fragments[1])循环之前的值,它们分别检查到 -6 和 11。显然,当我将这些值直接放入它们的位置时,循环有效,但是当我用strlen计算替换第二个时,它会中断,我无法弄清楚为什么我的生活。帮助?

编辑

OverlapStrength 将其参数作为常量,因此我无法更改它们,因此我很确定我不会在进行过程中更改片段。这是方法声明:

int OverlapStrength(const char one[], const char two[], int startOne, int startTwo)

片段的内容不应该很重要,但它们只是我试图从重叠的片段中拼凑起来的字符串。我已经检查了我的片段是否都正确输出,并且在声明此循环之外完成时,它们的长度是否正确计算。

4

2 回答 2

4

strlen返回 type 的值size_t,这可能是您的案例的 typedef unsigned int。然后您正在比较signed int( i) 和unsigned int( strlen(...))。然后 C 决定将您的签名值转换为无符号类型(因为默认类型提升)。-6转换为 unsigned int is 4294967290,因此您的比较为假,因此循环结束。

要解决此问题,您可以例如强制strlen转换为有符号值,例如:

i < (int) strlen(fragments[1])
于 2012-01-14T17:43:16.453 回答
0

在 for 循环中,代码(i < strlen(fragments[1])部分)在每次迭代时都会被评估。如果OverlapStrength将 的值更改为fragments[1]小于i,则循环将中止。

要解决此问题,请使用常量:

int loopUntil = strlen(fragments[1]);
for (int i = -strlen(fragments[2]) + 1; i < loopUntil; i++) {
    int test = OverlapStrength(fragments[1], fragments[2], i, 0);
    printf("%d\n", test);
}
于 2012-01-14T17:41:04.997 回答