分段错误:C中的核心转储错误
我正试图编写一个程序来存储和打印所有超过80个字符的行。这是我的密码:分段错误: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
#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]);
}
}