C:如果我们不知道长度,如何用fgets()填充表?

时间:2018-12-21 09:32:11

标签: c

我正在尝试使用fgets()方法逐字填充表格。我需要用用户逐步写出的单词(最多25个)填充表格。问题是,如果我举个例子,在我的终端上:

  • ab(然后按Enter)
  • ac(然后按Enter)
  • ad(然后按Enter)
  • tu(然后按Enter)
  • (然后按ctrl + d停止)

输出为:

  • tu
  • tu
  • tu
  • tu

所以基本上,它只是复制我输入的每个输入的最后一个单词

我尝试替换“ tab [length] = line;”用“ strcpy(tab [length],line);” 但是当我这样做时,我遇到了“分段错误(核心已转储)”

#define NBRE_CHAR 256

int main(int argc, char const *argv[])
{   
    char* tab[25];
    int length =0;
    char line[NBRE_CHAR];
    while(fgets(line,NBRE_CHAR,stdin) != NULL){
        line[strlen(line)-1] = '\0'; // to delete \n
        tab[length] = line;
        length++;
    }
    for (int i = 0; i < length; i++)
    {
        printf("%s\n", tab[i] );
    }
}

1 个答案:

答案 0 :(得分:2)

char* tab[25];是由25个指针指向字符(字符串)的数组。

使用tab[length] = line;将缓冲区line分配给数组。但这不会复制字符串。结果,所有条目都指向您的单行缓冲区,该缓冲区将具有您最后输入的字符串。

您可能想要的是:

    char* tab[25];
    //...
        tab[length]= malloc(strlen(line)+1);
        strcpy(tab[length], line);

这会为每个字符串分配内存,然后将缓冲区的内容复制到该内存中。