我正在使用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]) + 1
和strlen(fragments[1])
的值,它们分别检查到-6和11。很明显,当我将这些值直接放入它们的位置时循环起作用,但是当我用strlen
计算替换第二个时,它会中断,我无法弄清楚为什么我的生活。帮助
修改
OverlapStrength将其参数作为常量,因此我无法更改它们,所以我很确定我不会像我一样改变碎片。这是方法声明:
int OverlapStrength(const char one[], const char two[], int startOne, int startTwo)
片段的内容不应该很重要,但它们只是我试图从重叠片段拼凑回来的字符串。我已经检查过我的片段是否正确出来,并且在声明此循环之外完成时,它们的长度是正确计算的。
答案 0 :(得分:4)
strlen
返回size_t
类型的值,对于您的案例,它可能是unsigned int
的typedef。然后,您要比较signed int
(i
)和unsigned int
(strlen(...)
)。然后,C决定将您的签名值转换为无符号类型(因为default type promotions)。转换为unsigned int的-6
为4294967290
,因此您的比较为false,因此循环结束。
要解决此问题,您可以将strlen
转换为有符号的值,例如:
i < (int) strlen(fragments[1])
答案 1 :(得分: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);
}