c - 如何修复段错误 : 11 compiler error

标签 c segmentation-fault

我一直在学习 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; 

还有一个本地 lenmain功能。

您正在初始化 lenmain像这样的功能:

while((len = getinput(line, MAXLINE)) > 0)

所以本地len已更新。但是全局len还是0 .

如你所料,你将获得 len 的更新值在 trailrem方法,但你没有。在 trailrem()你会得到 len等于 0 !

for(i = len; input[i] != EOF && i >= 0; --i)

所以 i0也。因此,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/

相关文章:

c - 如何简化大量的 C if 语句?

c - 我的程序忽略了 'while' 循环

c - 使用带有二维连续数组的 MPI_Sendrecv 的段错误

c - 如何使用 scanf() 在 C 中接受 char *

在收到 SIGSEGV 或 SIGBUS 后,进程能否以某种方式继续而不会崩溃?

c - strcmp 只返回 0(回文算法错误)

c - C 是否有任何用于执行字符串添加的工具?

c++ - 如何在所有线程中同步一个变量的值?

C malloc结构体执行错误

c++ - 使用文件 I/O C++ 时出现段错误 11