簡體   English   中英

需要知道如何在 c 中按空格解析單詞。 還需要知道我是否正確分配內存?

[英]Need to know how to parse words by space in c. Also need to know if I am allocating memory correctly?

我正在用 c 編寫一個程序,它從文本文件中讀取文本,然后從文件中隨機選擇單詞,如果單詞大於或等於 6,則將單詞附加在一起,刪除空格,最后打印新單詞。 (我在 linux 上使用重定向“<”來讀入文件)

 Example input: "cheese and crackers" New word should be: cheesecrackers

這是代碼:

int main (void)
{
    int ch;
    char *ptrChFromFile;
    int strSize = 1;
    int i;
    int numberOfWords = 1;

    ptrChFromFile = malloc (sizeof (char));

    if (ptrChFromFile == NULL) {
        puts ("COULDN'T ALLOICATE MEMORY");
        exit (EXIT_FAILURE);
    }

    while ((ch = getchar ()) != EOF) {
        ptrChFromFile =
            realloc (ptrChFromFile, (strSize + 1) * sizeof (char));

        if (ptrChFromFile == NULL) {
            puts ("failed to allocate memory");
            exit (EXIT_FAILURE);
        }

        if (ch == ' ') {
            numberOfWords++;
        }

        ptrChFromFile[strSize] = ch;
        strSize++;
    }

    ptrChFromFile[strSize] = 0;

    char **ptrWords = malloc (sizeof (char *) * strSize);


    for (i = 0; i < strSize; i++) {
        if (ptrChFromFile[i] != ' ') {
            ptrWords[i] = &ptrChFromFile[i];
        }
        else {
            ptrWords[i] = 0;
        }
    }

    free (ptrChFromFile);
    free (ptrWords);
    return 0;
}

我正在努力解決的問題是:

1)我是否為指針分配了正確的內存大小?

2)如何在不使用 string.h 庫(如 strtok)中的任何特殊方法的情況下按空格解析每個單詞。 那么如何將這些單詞存儲在指針 *ptrWords 中呢?

所以 ptrWords 應該是這樣的:


奶酪 | 和| 餅干

 0 1 2

然后我想循環遍歷 ptrWords 並檢查指針中每個單詞的長度是否大於或等於 6。 如果將它們存儲在指針 ptrOutputWord 中。

所以 ptrOutputWord 應該是這樣的:


奶酪 | 餅干

 0 1

最后,我想將 ptrOutputWord 中的值打印為一個沒有空格的單詞。

我試圖解釋我到底想做什么。 感謝任何可以提前提供幫助的人。

編輯:我更改了代碼以僅反映應該讀入字符的部分,並在每次讀入新字符時將指針的大小重新分配一個,但沒有分配正確的內存量。

你有幾個問題:

#include <stdio.h>
#include <time.h>

為什么是這個標題?

#include <stdlib.h>

int main()
{
  char ch, *ptrChFromFile; 
  int strSize;

這個變量需要有一個有用的起始值。

  ptrWordsFromFile = (char*)malloc(sizeof(char));

沒必要投。

  if(ptrChFromFile == NULL)
  {
     puts("COULDN'T ALLOICATE MEMORY");
     exit(EXIT_FAILURE);
  }

  while((ch = getchar()) != EOF)

getchar返回和int ,而不是char

  {
    ptrChFromFile  = (char*)realloc(ptrChFromFile, strSize * sizeof(char)+1);

我們需要比以前多一個字符並為0額外的空間。 您應該將 +2(而不是 +1)添加到元素數中: (strSize+2) * sizeof(<any type>)

通常你不應該直接將realloc的結果分配給同一個指針。 如果失敗,您將丟失舊的指針值。 再次:不需要演員。

    if(ptrChFromFile == NULL)
      {puts("failed to alloicate memory");}

如果失敗,您將無法繼續! 和上面一樣退出程序

    *ptrChFromFile = ch;

您將字符放在擴大的緩沖區的開頭。 你應該在最后添加。

    strSize++;
  }

現在您在內存中有一堆字符,但沒有終止字符串。

  free(ptrChFromFile);
  return 0;
}

修好之后是這樣的:

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

int main(void)
{
  int ch;
  char *ptrChFromFile; 
  int strSize = 0;

  ptrWordsFromFile = malloc(sizeof(char));

  if (ptrChFromFile == NULL)
  {
     puts("COULDN'T ALLOICATE MEMORY");
     exit(EXIT_FAILURE);
  }

  while ((ch = getchar()) != EOF)
  {
    ptrChFromFile = realloc(ptrChFromFile, (strSize+2) * sizeof(char));

    if (ptrChFromFile == NULL)
    {
      puts("failed to allocate memory");
      exit(EXIT_FAILURE);
    }

    ptrChFromFile[strSize] = ch;
    strSize++;
  }
  ptrChFromFile[strSize] = 0;

  // Now add detection and storing of separate words
  // (You might omit storing words that are too short)
  // Select random words and add together.

  free(ptrChFromFile);
  return 0;
}

暫無
暫無

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

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