Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分段错误:C中的核心转储错误_C - Fatal编程技术网

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

分段错误:C中的核心转储错误,c,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

我正试图编写一个程序来存储和打印所有超过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");
    }
}
然后是分割错误。 “小问号字符”根据输入的长度(行数和每行长度)显示不同的数量


我需要帮助理解原因,因为我已经初始化了我的字符和数组,并向它声明了内存。感谢您的帮助

您的代码中有几个问题。正如注释中提到的“长度是单位化的”,带有-Wall选项的编译器会告诉您,您不应该从堆栈中分配太多内存,而应该使用malloc/calloc,尽管如此,我们并没有破坏程序。当你遇到缩进/括号问题,这使得完全理解代码应该做什么变得复杂,并且我相信你在最后两个for循环中有输入错误,
loop1
递增,但使用了
loop
loop2

最后,分段错误可能来自错误使用
getchar
,每次从
stdin
读取字符时,您都会增加
line
,最后您可能会有100多行,其中有1个字符,您应该使用
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]);
    }
}
#包括
#包括
#包括
//打印长度大于80个字符的所有行。
#定义MAXLENGTH 1000
#定义MAXLINES 100
int main(){
printf(“输入内容”\n);
字符渐变[MAXLINES][MAXLENGTH];
int a,b,loop1,loop,line=0;
布尔线[最大线];
对于(a=0;a80)
行[行]=真;
line++;
如果(行==最大行)中断;
}
for(loop1=0;loop1

最后一件事,核心转储是程序崩溃时使用的内存的副本,gdb之类的调试器可以读取它,您会发现
line
远远超过
MAXLINES

在堆栈上放置100000字节数组(cline)不是一个好主意。如果您确实需要这种大小的数据结构(您可能不需要),那么您应该使用malloc动态分配它。请花一些时间学习如何使用调试器。变量“length”未初始化。
length++未初始化的变量。正如所建议的,调试器将对您有所帮助。代码中有太多问题,无法给出简单的答案。但对于初学者来说,您的第一个
while
循环完全是错误的。每次
迭代时,
getchar
只被调用一次,但它内部的
for
循环保持存储相同的
输入值。我不知道你为什么用
+=
而不是
=
来存储
输入值。谢谢你,你的代码为我工作了。但为什么每个人都认为长度是未初始化的呢?在C语言中,当你在堆栈上声明一个变量(一个局部变量)时,它的值是当时堆栈上的任何值,可以是任何值。int length只是声明了一个整数,int length=0声明了一个等于零的整数。。这是有道理的。谢谢
#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]);
    }
}