当我添加for循环时,我得到分段错误。此外,当我在while循环条件中添加buffer [i]!='\ 0'时,我得到分段错误错误。我很难理解为什么会弹出这个错误。感谢。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char buffer[2000] = "-rw-r--r-- 1 ftp ftp 614400 Oct 18 2006\r\n"
char String[2000];
int i, j, k= 0;
int nextline= 0;
for(k = 0; k<strlen(buffer);k++)
{
while((buffer[i] != '\r' && buffer[i+1] != '\n'))
{
String[j] = buffer[i];
i++;
j++;
}
}
printf("%s", String);
}
答案 0 :(得分:1)
for(k=0; k < strlen(buffer); k++) { ... }
形式的循环通常是非常糟糕的代码。它是O(n²),意味着当n增加时,循环的时间会随着时间的推移而增加。为什么?每次通过循环时,都会调用strlen
函数来确定buffer
中字符串的长度。如果字符串长度为1000个字符,则每个strlen
内部循环1000次,并且它本身被调用1000次,内循环的1000000次迭代!相反,字符串的长度应该在循环外计算一次。例如)
int buffer_len = strlen(buffer);
for(k=0; k<buffer_len; k++) { ... }
您也可以使用char *
作为循环索引,并循环直到遇到空字符:
for(char *c_ptr = buffer; *c_ptr != '\0'; *c_ptr++) { ... }
无论如何,对于你的问题,你不需要双循环:
for(k = 0; k < strlen(buffer); k++)
{
// ...
while( /* incorrect condition here */ ) {
// ...
}
// ...
}
以上建议你想循环遍历字符串中的每个字符,然后从每个字符开始,执行另一个内部循环。您 可能 想要的只是if( )
声明:
for(k = 0; k < strlen(buffer); k++)
{
// ...
if( buffer[k] == '\r' && buffer[k+1] == '\n' ) {
// ...
}
// ...
}
如果有的话,我会让你为// ...
评论中的内容而烦恼。你可以通过这样做了解更多。
正如其他人所指出的那样,你的i
&amp; j
个变量未初始化。您需要确保在使用它们之前正确初始化它们。您确实将k
初始化为零,这实际上是不必要的,因为for(k=0; ... ; ...)
循环已经初始化k
的值。