У меня есть глупая проблема при чтении ввода со следующим кодом.Ошибка сегментации при считывании ввода с помощью 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 строки, они дают ошибку сегментации, но при вводе более или менее строк нет проблем. В чем может быть проблема? Пожалуйста, помогите!
Совет в этом случае прост: не перераспределяйте память внутри 'getchar()' loop. Найти ошибку не так просто: Похоже, что происходит некоторая стековая коррупция. –
Ваша функция делает слишком много. Разделите свою проблему на меньшие части (функции) и получите более значимые имена идентификаторов. Кроме того, не бросайте возвращаемое значение malloc/realloc в C. – user694733
'query [i] = NULL;' wrong. – BLUEPIXY