添加 for 循环时出现分段错误
Segmentation Fault when I add a for Loop
当我添加 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);
}
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 != '[=11=]'; *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
和 j
变量未初始化。您需要确保在使用它们之前正确地初始化它们。您确实将 k
初始化为零,这实际上是不必要的,因为 for(k=0; ... ; ...)
循环已经在初始化 k
.
的值
当我添加 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);
}
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 != '[=11=]'; *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
和 j
变量未初始化。您需要确保在使用它们之前正确地初始化它们。您确实将 k
初始化为零,这实际上是不必要的,因为 for(k=0; ... ; ...)
循环已经在初始化 k
.