分段错误:C中的核心转储错误

去做

我正在尝试编写一个程序,该程序存储和打印所有长度超过80个字符的行。这是我的代码:

#include <stdio.h>
#include<stdbool.h>

//prints all lines that are greater than 80 characters in length.
#define MAXLENGTH 1000
#define MAXLINES 100

main(){
    printf("Enter stuff\n");
    char cline[MAXLINES][MAXLENGTH];
    int a, b, input, loop1, loop, length, line = 0, loop2;
    bool lines[MAXLINES];
    for(a = 0; a < MAXLINES; a++)
        for(b = 0; b < MAXLENGTH; b++)
            cline[a][b] = ' ';
    for (loop = 0; loop < MAXLINES; loop++)
        lines[loop] = false;
    while((input = getchar()) != EOF){
        for(loop = 0; loop < MAXLENGTH; loop++){
            cline[line][loop] += (char)input;
            length++;
            if(input == '\n')
                break;
        }
        if(length > 80)
            lines[line] = true;
        line++;
    }
    for(loop1 = 0; loop1 < MAXLINES; loop1++){
        lines[loop] = false;
    while((input = getchar()) != EOF){
        for(loop = 0; loop < MAXLENGTH; loop++){
            cline[line][loop] += (char)input;
            length++;
            if(input == '\n')
                break;
        }
        if(length > 80)
            lines[line] = true;
        line++;
    }
    for(loop1 = 0; loop1 < MAXLINES; loop1++){
        if (lines[loop] == true)
            for(loop2 = 0; loop2 < MAXLENGTH; loop2++)
                putchar(cline[loop][loop2]);
        printf("\n");
    }
}

如果一行的长度超过80个字符,则会出现此错误:
分段错误(核心已转储)

如果没有一行超过80行,我会得到一堆像这样的随机字符:

Enter stuff
hello
       �������������������������������������������������������������������������

fazer@Deamons-head:~/Programs/C$ Segmentation fault (core dumped)

然后是分割错误错误。根据输入的长度(行数和每行长度),“小问号字符”出现的数量不同。

我需要了解原因,因为我已经初始化了我的字符和数组并为其声明了内存。任何帮助表示赞赏。

取决于

您的代码中有几个问题。正如注释中提到的长度是单位化的那样,具有-Wall选项的编译器会告诉您,并且您不应该从堆栈中分配过多的内存,而应使用malloc / calloc,因为这不会使程序崩溃。当您遇到缩进/括号问题后,很难完全理解代码应该执行的操作,而且我相信您在最后两个for循环中有错别字,loop1但递增了,loop并且loop2被使用了。

最后,分割错误可能是由于错误地使用引起的getchar,您line每次从中读取一个char时都stdin在增加,最后您可能有100多个带有1个char的行,您应该使用fgets它将直接读取一行。

这是我想做的一些代码

#include <stdio.h>
#include<stdbool.h>
#include <string.h>

//prints all lines that are greater than 80 characters in length.
#define MAXLENGTH 1000
#define MAXLINES 100

int main(){
    printf("Enter stuff\n");
    char cline[MAXLINES][MAXLENGTH];
    int a, b, loop1, loop, line = 0;
    bool lines[MAXLINES];
    for(a = 0; a < MAXLINES; a++)
        for(b = 0; b < MAXLENGTH; b++)
            cline[a][b] = ' ';
    for (loop = 0; loop < MAXLINES; loop++)
        lines[loop] = false;
    while((fgets(cline[line], MAXLENGTH, stdin)) != NULL){
        if(strlen(cline[line]) > 80)
            lines[line] = true;
        line++;
        if(line == MAXLINES) break;
    }
    for(loop1 = 0; loop1 < MAXLINES; loop1++){
        if (lines[loop1] == true)
            printf("%s\n", cline[loop1]);
    }
}

最后一件事,核心转储是程序崩溃时所用内存的副本,像gdb这样的调试器可以读取它,并且您会发现这line已经过去了MAXLINES

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章