2012-01-14 60 views
3

我正在使用C中的字符串作为字符数组,我试图确保我可以动态地将值传递给我的for循环。C For Loop不工作?

下面的代码工作,没有问题:

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); 
} 

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

编辑

OverlapStrength接受它的参数为常数,所以我不能改变他们,所以我敢肯定,我不会改变的片段,我去。这里的方法声明:

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

片段的内容不应该是很重要的,但他们只是说我试图从重叠的片段拼凑回字符串。我已经检查过我的碎片全部正常出来,并且在声明这个循环之外完成了它们的长度计算。

+6

不'OverlapStrength'改变'的strlen(片段[1])'的值? – 2012-01-14 17:37:50

+0

OverlapStrength的参数被特别声明为常量,所以我无法更改它们。编辑原始帖子以显示该代码。 – Chiubaka 2012-01-14 17:43:27

回答

4

strlen回报size_t类型的值,这可能是为unsigned int你的案件的类型定义。然后,您正在比较signed inti)和unsigned intstrlen(...))。 C决定然后将您的签名值转换为无符号类型(由于default type promotions)。 -6转换为无符号整数是4294967290,因此您的比较是错误的,所以循环结束。

为了解决这个问题,可以例如投strlen为有符号值,例如:

i < (int) strlen(fragments[1]) 
+0

啊!好的,@Femaref的答案奏效了,但你的确向我解释了为什么。这很有道理,我没有这么想。谢谢! – Chiubaka 2012-01-14 17:50:27

+0

liori,你是对的。应该看到这一点,通常我很擅长检测这些演员。 – Femaref 2012-01-14 17:52:38

0

在for循环中,每次迭代都会对代码(​​部分)进行评估。如果OverlapStrengthfragments[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); 
} 
+1

我的猜测是'OverlapStrength'完全没有执行,请参阅我的答案。然而,你的代码会意外地通过将strlen转换为int来解决这个问题。 – liori 2012-01-14 17:44:42