[英]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.