如果我在for循环的条件中使用strlen()
会有什么问题。
char s[i];
for (int i = 0; strlen(s); i++)
因此,如果我使用高级代码,则需要花费大量时间。
但是,如果我存储strlen
s
的值,则只需要很少的时间检查上层代码。
这些有什么区别?
答案 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
秒来查看更大的差异。