我添加for循环时出现分段错误

时间:2016-03-15 21:02:32

标签: c string parsing memory fault

当我添加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);               
}

1 个答案:

答案 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的值。

相关问题