C - 打印char *的数组

时间:2017-09-27 01:38:51

标签: c arrays g++

我正在尝试阅读数千个单词并仅打印前15个单词,但它打印的唯一单词是数组中存储单词的最后一个单词。

g ++ --version g ++(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3

从下面的答案中我得到了下面的代码来逐行读取文件 C read file line by line

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

unsigned char *words[25143];

int readDictionary(void)
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
        ssize_t read;
        int count = 0;


    fp = fopen("dictionary.txt", "r");
    if (fp == NULL)
        {
        printf("failed to open file");
        exit(EXIT_FAILURE);
        }
    while ((read = getline(&line, &len, fp)) != -1) {
                printf("%s", line);
                words[count] =(unsigned char*) line;
                count++;
    }

    fclose(fp);
    if (line)
        free(line);

}

int main (void)
{

  readDictionary();
  printf("we just read the dictionary\n");
  for (int k= 0; k <15; k++)
  {
        printf("%d      %s",k,(unsigned char*)words[k]);
  }
}

3 个答案:

答案 0 :(得分:0)

你的数组中的所有指针都被设置为相同的char *(行),它在循环中的每次迭代都被覆盖,留下一个char指针数组,在数组的每个索引中都有相同的指针和指针指向内存中已反复写入的位置,直到用字典中的最后一项覆盖它。要按照您希望行的方式执行此操作,需要为循环中的每次迭代使用不同的char *。

答案 1 :(得分:0)

看看getline的描述,它告诉它只有在传递的行为NULL时才会分配缓冲区。它只是第一次为NULL,因此将重用缓冲区或增加它,如果行不适合。

如果您希望它为每个单词分配单独的缓冲区,请执行

printf("%s", line);
words[count] =(unsigned char*) line;
line = NULL;
count++;

并删除

if (line)
    free(line);

但不要忘记稍后在某处释放所有非空字段条目。

答案 2 :(得分:0)

打印整个数组/向量,您需要迭代所有项目。 例: 你有一个5单位的矢量,打印你需要的所有

//Pseudo code
for(int i = 0;i < vectorex;i++)
    {
     print vectorex[i];
    }

这样它会遍历所有的anwser并打印出来