【问题标题】:C For Loop Not Working?C For 循环不工作?
【发布时间】:2012-01-14 17:35:07
【问题描述】:

我正在使用 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)

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

【问题讨论】:

  • OverlapStrength 是否改变了strlen(fragments[1]) 的值?
  • OverlapStrength 的参数被特别声明为常量,因此我无法更改它们。编辑原始帖子以显示该代码。

标签: c string for-loop c-strings


【解决方案1】:

strlen 返回 size_t 类型的值,对于您的情况,这可能是 unsigned int 的 typedef。然后您将比较 signed int (i) 和 unsigned int (strlen(...))。然后 C 决定将您的有符号值转换为无符号类型(因为 default type promotions)。 -6 转换为 unsigned int 是4294967290,因此你的比较是假的,所以循环结束。

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

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

【讨论】:

  • 啊!好的,@Femaref 的回答有效,但你的回答实际上向我解释了原因。有道理,我没有这么想。谢谢!
  • liori,你是对的。应该已经看到了,通常我擅长检测这些演员。
【解决方案2】:

在 for 循环中,代码(i &lt; strlen(fragments[1]) 部分)在每次迭代时都会被评估。如果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);
}

【讨论】:

  • 我的猜测是 OverlapStrength 根本没有执行,请参阅我的答案。但是,您的代码也会意外地解决此问题,方法是将 strlen 强制转换为 int。
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2020-03-30
  • 2018-05-29
相关资源
最近更新 更多