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

标签 c

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

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

输出为:

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

我尝试替换“tab[length] = line;”与“strcpy(制表符[长度],行);” 但是当我这样做时,我遇到了“段错误(核心转储)”

#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] );
    }
}

最佳答案

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

使用tab[length] = line;,您可以将缓冲区line分配给数组。但这并没有复制字符串。因此,所有条目都指向您的单行缓冲区,其中将包含您最后输入的字符串。

您可能想要的是:

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

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

关于C:如果我们不知道长度,如何使用 fgets() 填充表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53882262/

相关文章:

c - 语义版本控制 : minor or major change?(第二部分)

c - 将 size_t 保存为无符号字节

c++ - 如何为 Roland UM 4 实现 MIDI 驱动程序?

c++ - 如何知道 const 数组的大小?

c - 分配给局部堆栈变量的堆栈偏移量是否曾被重用,例如万一它死了或者超出范围了?

c - 这是一个 C 程序,用于查找具有相同数字的下一个最大数字。但是没有通过一个测试用例

c - 为什么当我在 c 中使用 system 系统调用访问时 PROMPT_COMMAND 似乎是空的

c - 在 GCC 中使用自定义主加载器

c - 一个动画处理图标,纯C

c - 问 : Arrays and Functions Homework