2014-01-23 1 views
0

У меня есть глупая проблема при чтении ввода со следующим кодом.Ошибка сегментации при считывании ввода с помощью getchar()

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 


void read(char*** query) 
{ 
    *query = (char**) malloc (sizeof(char*)); 

    int f=0; 
    int i=0,j=0,c; 

    while((c=getchar())!=EOF) 
    { 
     if(!isalpha(c)) 
      continue; 

     if(f==1) 
      *query=(char**) realloc(*query,(i+1)*sizeof(char*)); 

     (*query)[i]=(char*) malloc(sizeof(char)); 
     (*query)[i][j]=tolower(c); 
     j++; 

     while((c=getchar())!=EOF&&c!=' '&&c!='\t'&&c!='\n') 
     { 

      (*query)[i]=(char*) realloc((*query)[i],(j+1)*sizeof(char)); 

      (*query)[i][j]=tolower(c); 
      ++j; 
     } 

     (*query)[i][j]='\0'; 

     ++i; 
     f=1; 
     j=0; 

     if(c==EOF) 
     { 
      *query=(char**) realloc(*query,(i+1)*sizeof(char*)); 
      query[i]=NULL; 
      return; 
     } 
    } 


    *query=(char**) realloc(*query,(i+1)*sizeof(char*)); 
    query[i]=NULL; 

} 

int main() 
{ 

    char** query; 
    int i=0; 
    read(&query); 

    while(query[i]!=NULL) 
    { 
     printf("%s\n",query[i]); 
     i++; 
    } 

    return 0; 
} 

Итак, я хочу, чтобы ввести любое количество строк, состоящих из буквенных символов, разделенных любым количеством пробелов и табуляций вдоль одной линии, а затем нажмите кнопку ввода и дать сигнал EOF. (CTRL + D под Linux терминала.) Затем он должен выводить строки по строкам. Проблема заключается в том, когда я ввожу 3 строки, они дают ошибку сегментации, но при вводе более или менее строк нет проблем. В чем может быть проблема? Пожалуйста, помогите!

+0

Совет в этом случае прост: не перераспределяйте память внутри 'getchar()' loop. Найти ошибку не так просто: Похоже, что происходит некоторая стековая коррупция. –

+2

Ваша функция делает слишком много. Разделите свою проблему на меньшие части (функции) и получите более значимые имена идентификаторов. Кроме того, не бросайте возвращаемое значение malloc/realloc в C. – user694733

+1

'query [i] = NULL;' wrong. – BLUEPIXY

ответ

0

query[i]=NULL; не правильный. - BLUEPIXY

@BLUEPIXY: Хороший улов. Кроме того, в логике OP, есть должно быть Перераспределение перед тем

(*query)[i][j]='\0'; 

, чтобы освободить место для нулевого символа. - M Oehm

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