我刚刚开始学习C语言,所以我写了一个小程序来练习使用char数组。
它从stdin
中接收一个字符串,并在删除结尾的空格和空行后将其打印出来(如果您有第二版的“ C编程语言”,则问题1-18)。
但是,按EOF键结束输入后,程序将退出,并出现错误:“分段错误(内核已转储)”。
我已经使用Wall
,Wextra
,Werror
和g
进行了编译,但是在编译时未显示任何错误(在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)
有人可以帮我调试该程序吗?
答案 0 :(得分:1)
看来TheLookupColumn
将继续循环直到耗尽内存。您是否要使用逻辑而不是逻辑或?尝试GetToEndLine()
for (; (c = input[start + i]) != '\n' && c != '\0'; ++i)
那应该可以解决您当前的段错误问题。