我一直在学习 C 编程语言书籍 (K&R),并且正在编写一个从输入中删除尾随空白的练习。我知道段错误在某种程度上是与访问不可访问的内存有关的问题,但是我已经多次阅读这段代码并且找不到错误。如果有人能帮助找到这个错误并告诉我以后如何发现这样的错误,我将非常高兴。
#include <stdio.h>
#define MAXLINE 1000
#define CHAR 0 /*character definition*/
#define TRAIL 1 /*determines whether program is in a trailing blank*/
int getinput(char input[], int max);
int trailrem(char input[], char copyto[]);
int len;
int main() {
char line[MAXLINE]; /*current line*/
char newline[MAXLINE];
int i, c, newreturn; /*integer counter, character holder, current line length, and trailrem return value*/
int len;
while((len = getinput(line, MAXLINE)) > 0) {
newreturn = trailrem(line, newline);
for(i = 0; i <= newreturn; ++i)
printf("\n%c\n", newline[i]);
}
}
int getinput(char input[],int max) {
int i, c, line;
for(i = 0; (c = getchar()) != EOF && c != '\n' && c < (max-1); ++i)
input[i] = c;
if(c == '\n') {
input[i] = c;
++i;
}
input[i] = '\0';
return i;
}
int trailrem(char input[], char copy[]) {
int i, j, minusin, state, r;
for(i = len; input[i] != EOF && i >= 0; --i) {
if(input[i] =='\n')
state = TRAIL;
else if((input[i] == ' ' && state == TRAIL) ||( input[i] == '\t' && state == TRAIL))
++minusin;
else if(state == TRAIL && (input[i] != ' ' || input[i] != '\t'))
state = CHAR;
for(j = (r = len-minusin); state == CHAR; --j){
copy[j-2] = input[i];
}
}
copy[r] = '\0';
copy[r-1] = '\n';
return r;
}
最佳答案
你的代码中有很多问题。但主要问题是,你有一个 global
len
int len;
还有一个本地 len
在main
功能。
您正在初始化 len
在 main
像这样的功能:
while((len = getinput(line, MAXLINE)) > 0)
所以本地len
已更新。但是全局len
还是0
.
如你所料,你将获得 len
的更新值在 trailrem
方法,但你没有。在 trailrem()
你会得到 len
等于 0
!
for(i = len; input[i] != EOF && i >= 0; --i)
所以 i
是0
也。因此,copy[r-1] = '\n';
会崩溃,因为r-1
可以是负数。
其他问题:(评论中提到的BLUEPIXY和WhozCraig)。
for(i = 0; (c = getchar()) != EOF && c != '\n' && c < (max-1); ++i)
在这里,c < (max-1)
应该是 i < (max-1)
.
++minusin;
在 trailrem
函数在哪里 minusin
未初始化。
关于c - 如何修复段错误 : 11 compiler error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857535/