【问题标题】:How to fix segmentation fault: 11 compiler error如何修复分段错误:11 编译器错误
【发布时间】:2015-06-16 01:37:17
【问题描述】:

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

}

【问题讨论】:

  • C 或 C++,选择一种语言。
  • 0) ++minusin 未初始化。
  • 1) for(j = (r = len-minusin); state == CHAR; --j){ 错误。
  • c &lt; (max-1) 作为getinput 中的退出条件看起来不正确。很确定应该是i &lt; (max-1)
  • 对你写的代码有很多反对意见。请告诉我那是什么练习。

标签: c segmentation-fault


【解决方案1】:

您的代码中有很多问题。但主要问题是,你有一个global len

int len; 

以及main 函数中的本地len

您正在像这样在main 函数中初始化len

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

所以本地的len 被更新了。但是全局的len还是0

您期望,您将在trailrem 方法中获得len 的更新值,但您没有。在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 &lt; (max-1) 应该是 i &lt; (max-1)

trailrem 函数中的++minusin; minusin 未初始化。

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多