使用getchar()读取输入时出现分段错误

时间:2014-01-23 14:22:55

标签: c segmentation-fault malloc 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信号。(在linux终端下的CTRL + D。)然后,它应该逐行输出字符串。 问题是当我输入3个字符串时它会给出分段错误,但是当我输入更多或更少的字符串时没问题。 可能是什么问题? 请帮忙!

1 个答案:

答案 0 :(得分:0)

query[i]=NULL;错了。 - BLUEPIXY

@BLUEPIXY:好抓。此外,在OP的逻辑中,应该在

之前重新分配
(*query)[i][j]='\0';

为null char腾出空间。 - M Oehm