2015-06-16 14 views
0

Я изучаю книгу языков программирования C (K & R) и писал одно из упражнений, которое удаляет конечные пробелы из ввода. Я понимаю, что ошибка сегментации на каком-то уровне связана с проблемой доступа к недоступной памяти, но я прочитал этот код несколько раз и не могу найти ошибку. Я бы очень хотел, чтобы кто-то мог помочь найти эту ошибку и рассказать мне, как обнаружить такие ошибки в будущем.Как исправить ошибку сегментации: 11 ошибка компилятора

#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; 

} 
+1

C или C++ выберите язык. –

+0

0) '++ minusin' неинициализирован. – BLUEPIXY

+0

1) 'for (j = (r = len-minusin); состояние == CHAR; -j) {' неверно. – BLUEPIXY

ответ

4

Так много проблем в вашем коде. Но главная проблема в том, у вас есть globallen

int len; 

И в функции main местного len.

Вы инициализация 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 and WhozCraig упоминается в комментарии).

for(i = 0; (c = getchar()) != EOF && c != '\n' && c < (max-1); ++i) 

здесь, c < (max-1) должен быть i < (max-1).

++minusin; в trailrem функция, где minusin неинициализирован.

Смежные вопросы