如果我在for循环中使用strlen()
会出什么问题。对于在C中循环困惑
char s[i];
for (int i = 0; strlen(s); i++)
所以,如果我使用上层代码,那就花了很多时间。 但是,如果我存储的strlen
的值,则检查较高代码花费的时间很少。
这些有什么不同?
如果我在for循环中使用strlen()
会出什么问题。对于在C中循环困惑
char s[i];
for (int i = 0; strlen(s); i++)
所以,如果我使用上层代码,那就花了很多时间。 但是,如果我存储的strlen
的值,则检查较高代码花费的时间很少。
这些有什么不同?
您不应该使用i < strlen(s)
作为条件,因为s
中的字符串长度会在循环的每次迭代中得到重新计算。这是更好地使用单独的变量,计算在初始化部分的长度:
for (size_t i = 0, len = strlen(s); i < len; i++) {
...
}
请注意,您的s
定义看起来像一个错字:char s[i];
。你指的是什么变量i
?在定义一个新的i
变量的for
循环开始之前它的值是什么?
编辑
重新格式化您的代码后,我意识到还有更多的困惑:
for (int i = 0; strlen(s); i++)
这for
循环迭代只要字符串s
不为空。这是你的意图吗?你在循环中修改s
吗? s
未初始化,测试调用未定义的行为。你是否在初始化s
的代码中没有发布定义和for
循环之间的代码?如果这样做,用这种方式编写这样一个循环仍然会更高效:
for (int i = 0; *s != '\0'; i++)
在每次迭代循环之前评估条件。
C字符串只是一个字符数组,然后是一个NULL
。因此,要计算一开始就必须从头开始检查每个角色的长度,直到找到NULL
。
所以在复杂性方面,strlen是O(n)。你的for也是O(n)。如果你每次检查strlen
那么你的实现是O(n * n)。如果你坚持一下,那么你就是O(n)。尝试使用更长的s
秒,以查看更大的差异。
您需要发布循环做什么来修改's'。如果将其长度更改为“0”,则循环将结束。如果它不是它是无限的。无论如何,这是未定义的行为,因为's'是未初始化的。 –
for(int i = 0; i
user3528438
为什么使用'i'来定义字符串的长度并控制循环?这是一个不同的'我'。请使用明智实施和明智命名的变量。 –