对于在C中循环困惑

时间:2016-03-05 19:50:07

标签: c loops

如果我在for循环的条件中使用strlen()会有什么问题。

    char s[i];
    for (int i = 0; strlen(s); i++)

因此,如果我使用高级代码,则需要花费大量时间。 但是,如果我存储strlen s的值,则只需要很少的时间检查上层代码。

这些有什么区别?

2 个答案:

答案 0 :(得分:2)

您不应该使用i < strlen(s)作为条件,因为s中字符串的长度会在循环的每次迭代中重新计算。最好使用单独的变量并计算初始化部分的长度:

for (size_t i = 0, len = strlen(s); i < len; i++) {
    ...
}

请注意,您对s的定义类似于拼写错误:char s[i];。您指的是哪个变量i?在定义新for变量的i循环开始之前它的值是什么?

修改

重新格式化代码后,我意识到更加困惑:

for (int i = 0; strlen(s); i++)

只要字符串for不为空,此s循环就会重复。这是你的意图吗?你在循环中修改s吗? s未初始化,测试调用未定义的行为。您是否在定义和s循环之间未发布的代码中初始化for?如果这样做,以这种方式编写这样的循环仍然会更有效:

for (int i = 0; *s != '\0'; i++)

答案 1 :(得分:1)

在循环的每次迭代之前评估条件。

C字符串只是一个字符数组,然后是NULL。因此,要计算出你必须从头开始的长度并从那里检查每个角色,直到找到NULL

因此在复杂性方面,strlen是O(n)。你的也是O(n)。如果每次都检查strlen,那么您的实现是O(n * n)。如果你在adavance中解决了一次问题,那么你可以使用os O(n)。尝试使用更长s秒来查看更大的差异。