c - 需要知道如何在c中按空格解析单词。还需要知道我是否正确分配内存?
问题描述
我正在用 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
返回 and int
,而不是 a 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;
}
推荐阅读
- xpath - html.fromstring() 和 etree.fromstring() 生成的树的差异
- java - 一维排序数组,但 array[i+1] 总是打印索引为零的元素
- excel - 在 VBA 中使用 .NET HashTable 返回类型
- swiftui - SwiftUI @State var 初始化问题
- python - discord.py-rewrite - 如何获得会员的加入排名?
- amazon-web-services - Gitlab CI:生成 JavaScript 包失败。在构建期间 - GitLab CI + AWS s3、cloudfront、gatsby.js
- python - 在 HTML 上运行 Python 脚本
- javascript - 如何创建一个与 microsoft excel sumproduct 相同的函数
- sql - 将 db2 中的数据从 N 模式中的所有表中导出到带有列名的 CSV
- reactjs - 如何在 redux reducer 中使用 ImmutableJS?