程序正在从文本文件中获取输入,然后按空间对其进行解析,然后将其存储在数组中。我在linux中使用“ <”读取文件。我需要创建一个动态分配的数组来存储单词
如果输入字符串是“我是戴着帽子的猫” 那么该数组应如下所示: 索引:
"I" "am" "the" "cat" "in" "the" "hat"
0 1 2 3 4 5 6
我遇到了细分错误,我不知道为什么会出现错误?我需要任何帮助。
代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int wordCount = 1, i;
char ch,* wordsArray;
while((ch = getc(stdin)) != EOF)
{
if(ch == ' ') {++wordCount;}
}
wordsArray =(char*)malloc(wordCount * sizeof(char));
for(i = 0; i<wordCount; i++)
{
scanf("%s",&wordsArray[i]);
printf("%s\n", wordsArray[i])
}
return 0;
}
编辑:我已经发布了实际的代码。我不再遇到细分问题,但是单词不在数组中。
示例输出:
a.out<dict.txt
(null)
(null)
(null)
(null)
(null)
(null)
(null)
答案 0 :(得分:1)
简而言之,您要让scanf
将字符串扫描到仅分配了足够大的几个整数的内存空间中。请注意,您的malloc调用被分配了许多整数,然后将其分配给char *
。这两件事并没有融合在一起,发生的事情是您正在将一堆字节扫描到缓冲区中,该字节太小,运行到最后,然后踩到其他东西,然后崩溃。编译器让您无所适从,因为malloc
和scanf
都设计为可与各种类型(void*
)一起使用,因此编译器不知道要强制使用哪种类型的一致性。这个案例。
如果您的目标是将输入字符串中的单词标记保存到单词数组中,则可以这样做,但是您需要预先分配完全不同的内容并对其进行一些不同的管理。
但是,如果您的目标只是产生所需的输出,则实际上有更简单的方法,例如使用strtok
或仅逐字符遍历输入char并跟踪您在哪里打了空格等。
答案 1 :(得分:0)
您要完成的工作是解析标准输入。某些功能可以为您提供帮助,例如 strtok()和 strsep()。
您将需要一个输入缓冲区,您可以分配或使用一个数组(我将使用数组)。当函数解析输入字符串时,您可以将单词的地址放到 char 指针数组中。您也可以建立一个链表。
最后,您必须缓冲输入,这增加了操作的复杂性。尽管如此,优秀的C程序员还是无法应付。玩得开心。