簡體   English   中英

C - 打印字符數組 *

[英]C - print array of char *

我正在嘗試讀取數千個單詞並僅打印前 15 個單詞,但它打印的唯一單詞是我存儲單詞的數組中的最后一個單詞。

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

從下面的答案中,我導出了下面的代碼來逐行讀取文件 C逐行讀取文件

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

看一下getline 的描述,它告訴它只有在傳遞的行為 NULL 時才分配緩沖區。 它只會在第一次為 NULL,因此將重用緩沖區或在行不適合時增加它。

如果您希望它為每個單詞分配單獨的緩沖區,請執行

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

並刪除

if (line)
    free(line);

但不要忘記稍后在某處釋放所有非空詞條目。

數組中的所有指針都被設置為相同的 char *(行),循環中的每次迭代都會被覆蓋,留下一個 char 指針數組,該數組的每個索引中都有相同的指針,並且該指針指向一個內存中的位置已被一遍又一遍地寫入,直到您用字典中的最后一項覆蓋它為止。 要以您想要的方式執行此操作,您需要為循環中的每次迭代使用不同的 char *。

要打印整個數組/向量,您需要遍歷所有項目。 例如:你有一個 5 個單位的向量,要打印所有你需要的向量

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

這樣它就會遍歷所有的 anwser 並打印出來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM