2014-09-09 4 views
1

Я пытаюсь написать программу, которая удаляет конечные пробелы/табуляции из строк ввода (упражнение 1-18 из K & R).Ошибка выполнения: ошибка сегментации (core dumped)

/* Write a program to remove trailing blanks and tabs from each 
line of input, and to delete entirely blank lines. */ 

#include <stdio.h> 
#define MAXLINE 1000 

int gettline(char s[], int lim); 

main() 
{ 
    int len, i; 
    char line[MAXLINE]; 
    while ((len = gettline(line, MAXLINE)) > 0) 
     for(i=0; i<len-1; ++i){ 
      if (line[i]!= ' ' && line[i]!='\t') 
       printf("%s", line[i]); 
     } 
    printf("\n"); 
    return 0; 
} 

/* gettline: read a line into s, return length */ 
int gettline(char s[], int lim) 
{ 
    int c, i; 
    for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
     s[i] = c; 
    if (c == '\n'){ 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

Когда я запустил его, я получаю сообщение об ошибке Segmentation fault (core dumped). Я просмотрел некоторые другие вопросы с той же темой (1, 2, 3, 4, ..), но они были слишком сложны для моего уровня. Я знаю только, что ошибка означает, что я попытался получить доступ к части памяти, на которую мне было запрещено. Я не знаю, где именно это произошло в моем случае

+0

Есть ли причина, по которой вы не используете' fgets' для чтения вашего файла по строкам? –

+1

Вы запустили gdb? – Vladp

+0

Прошу прощения, но я новичок в C, и я читаю K & R с самого начала. Я должен решить проблему без использования библиотек. @ Vladp Hm, no. Я только побежал его через valgrind, и он не дал никаких ошибок. – Omid

ответ

3

Причина неисправности SEG должна быть такой:

for(i=0; i<len-1; ++i){ 
     if (line[i]!= ' ' && line[i]!='\t') 
      printf("%s", line[i]); 
    } 

Из %s, printf() ожидает char * аргумента, но вы передаете один символ. Измените его на printf("%c", line[i]);, и он должен бежать.

Но это еще не будет делать то, что вы говорите, что вы хотите достичь («удалить конечные пробелы/вкладки»), потому что не будет печатать любые пространства или вкладки, «Hello World» стали бы " HelloWorld "

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