2016-03-05 86 views
-3

如果我在for循环中使用strlen()会出什么问题。对于在C中循环困惑

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

所以,如果我使用上层代码,那就花了很多时间。 但是,如果我存储的strlen的值,则检查较高代码花费的时间很少。

这些有什么不同?

+1

您需要发布循环做什么来修改's'。如果将其长度更改为“0”,则循环将结束。如果它不是它是无限的。无论如何,这是未定义的行为,因为's'是未初始化的。 –

+0

for(int i = 0; i user3528438

+0

为什么使用'i'来定义字符串的长度并控制循环?这是一个不同的'我'。请使用明智实施和明智命名的变量。 –

回答

2

您不应该使用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++) 
1

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

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

所以在复杂性方面,strlen是O(n)。你的for也是O(n)。如果你每次检查strlen那么你的实现是O(n * n)。如果你坚持一下,那么你就是O(n)。尝试使用更长的s秒,以查看更大的差异。