在C中的for循环条件中调用strlen()的最佳替代方法是什么?

Mit*_*rax 4 c string for-loop

我已经读过在我的for循环条件中调用strlen()是不好的做法,因为这是一个O(N)操作.

但是,在查看备选方案时,我会看到两种可能的解决方

int len = strlen(somestring);  
for(int i = 0; i < len; i++)  
{

}
Run Code Online (Sandbox Code Playgroud)

要么...

for(int i = 0; somestring[i] != '\0'; i++)  
{

}
Run Code Online (Sandbox Code Playgroud)

现在,第二种选择似乎可能具有以下优点:1)不声明不必要的变量,2)如果字符串长度在循环中被修改,只要长度不是<i,它应该仍然到达终点.

但是,我不确定.其中哪一个是C程序员的标准做法?

Vla*_*lad 9

第二个通常是首选.

另一种流行的形式是

for (char* p = something; *p; p++)
{
   // ... work with *p
}
Run Code Online (Sandbox Code Playgroud)

还有一个是

char* p = something;
char c;
while ((c = *p++))
{
    // ... do something with c
}
Run Code Online (Sandbox Code Playgroud)

(()为了使一些可疑的编译器不发出警告声明我可能意味着比较内部while条件,需要额外的分配)

实际上,strlen它很慢,因为它必须通过整个字符串寻找尾随0.因此,strlen基本上实现为

int s = 0;
while (*p++) s++;
return s;
Run Code Online (Sandbox Code Playgroud)

(实际上,使用稍微更优化的汇编程序版本).

所以你应该尽可能避免使用strlen.