gpt4 book ai didi

c - 段错误: core dumped error in C

转载 作者:行者123 更新时间:2023-11-30 19:43:07 26 4
gpt4 key购买 nike

我正在尝试编写一个程序来存储和打印所有长度超过 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 会递增,但 使用looploop2

最后,段错误可能来自于 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]);
}
}

最后一件事,核心转储是程序崩溃时所使用的内存的副本,像 gdb 这样的调试器可以读取它,并且您会发现 line 远远超过 最大行数

关于c - 段错误: core dumped error in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29995777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com