【问题标题】:Segmentation Fault when I add a for Loop添加for循环时出现分段错误
【发布时间】:2016-03-15 21:02:32
【问题描述】:

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

【问题讨论】:

  • 在使用 ij 之前,您似乎没有在任何地方初始化它们。
  • Joachim 是对的,"int i, j, k = 0" 仅将 k 初始化为零。
  • 缓冲区初始化后没有分号。
  • 我不知道在那种情况下String是否是关键字。
  • 正如 Joachim 所指出的,ij 未初始化,您的 while 是一个无限循环(buffer 中没有 \r\n )。

标签: c string parsing memory fault


【解决方案1】:

for(k=0; k &lt; 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' ) {
        // ...
    }
    // ...
}

如果有的话,我会让你去纠结// ... cmets 中的内容。您可以通过实践了解更多信息。

正如其他人所指出的,您的 ij 变量未初始化。您需要确保在使用它们之前正确初始化它们。您确实将k 初始化为零,这实际上是不必要的,因为for(k=0; ... ; ...) 循环已经在初始化k 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多