如何修复'Segmentation Fault(core dumped)'错误

时间:2019-07-18 20:13:40

标签: c arrays char

我刚刚开始学习C语言,所以我写了一个小程序来练习使用char数组。 它从stdin中接收一个字符串,并在删除结尾的空格和空行后将其打印出来(如果您有第二版的“ C编程语言”,则问题1-18)。 但是,按EOF键结束输入后,程序将退出,并出现错误:“分段错误(内核已转储)”。

我已经使用WallWextraWerrorg进行了编译,但是在编译时未显示任何错误(在Fedora 30上使用gcc 9.1.1) 。 我还通过gdb运行了程序,发现导致错误的行是以下行:

for (; (c = input[start + i]) != '\n' || c != '\0'; ++i)

我要粘贴整个文件,因为它是一个简短的程序,所有内容都可能是导致错误的原因。

#include <stdio.h>

#define MAX 100

int Read(char input[], int max);
void ProcessInput(char input[], char output[], int length);
int GetToEndLine(char input[], char outLine[], int startIndex);

int main(void){
    char input[MAX];
    char output[MAX];
    int length;
    printf("W: Max output is of %d chars.\n", MAX - 1);
    length = Read(input, MAX);
    ProcessInput(input, output, length);
    printf("\nCleaned input:\n---\n%s\n---\n", output);
    return 0;
}

int Read(char input[], int max){
    int i, c;
    for (i = 0; (c = getchar()) != EOF && i < max - 1; ++i)
        input[i] = c;
    input[i] = '\0';
    return i;
}

void ProcessInput(char input[], char output[], int length){
    int mainIndex = 0,
        new_mainIndex = 0,
        outputIndex = 0;
    char line[MAX];
    while ((length - mainIndex) > 0){
        new_mainIndex = GetToEndLine(input, line, mainIndex);
        if (new_mainIndex == mainIndex){
            ++mainIndex;
            continue;
        }
        for (int j = new_mainIndex - mainIndex; 
                line[j] == ' ' || line[j] == '\t' || line[j] != '\n'; --j)
            line[j] = '\0';
        for(int j = 0; line[j] != '\0'; ++j, ++outputIndex)
            output[outputIndex] = line[j];
        output[outputIndex] = '\n';
        ++outputIndex;
        mainIndex = new_mainIndex + 1;
    }
}

int GetToEndLine(char input[], char line[], int start){
    int c, 
        i = 0;
    for (; (c = input[start + i]) != '\n' || c != '\0'; ++i)
        line[i] = c;
    line[i] = c;
    return start + i;
}

成功运行测试的完整输出应为:

W: Max output is of 99 chars.
asdf   

asdf
Cleaned Input:
---
asdf
asdf
---

相反,我得到了:

W: Max output is of 99 chars.
asdf   

asdfSegmentation fault(core dumped)

有人可以帮我调试该程序吗?

1 个答案:

答案 0 :(得分:1)

看来TheLookupColumn将继续循环直到耗尽内存。您是否要使用逻辑而不是逻辑或?尝试GetToEndLine()

for (; (c = input[start + i]) != '\n' && c != '\0'; ++i)

那应该可以解决您当前的段错误问题。