C程序分割错误

时间:2019-03-02 00:45:47

标签: c

程序正在从文本文件中获取输入,然后按空间对其进行解析,然后将其存储在数组中。我在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)

2 个答案:

答案 0 :(得分:1)

简而言之,您要让scanf将字符串扫描到仅分配了足够大的几个整数的内存空间中。请注意,您的malloc调用被分配了许多整数,然后将其分配给char *。这两件事并没有融合在一起,发生的事情是您正在将一堆字节扫描到缓冲区中,该字节太小,运行到最后,然后踩到其他东西,然后崩溃。编译器让您无所适从,因为mallocscanf都设计为可与各种类型(void*)一起使用,因此编译器不知道要强制使用哪种类型的一致性。这个案例。

如果您的目标是将输入字符串中的单词标记保存到单词数组中,则可以这样做,但是您需要预先分配完全不同的内容并对其进行一些不同的管理。

但是,如果您的目标只是产生所需的输出,则实际上有更简单的方法,例如使用strtok或仅逐字符遍历输入char并跟踪您在哪里打了空格等。

答案 1 :(得分:0)

您要完成的工作是解析标准输入。某些功能可以为您提供帮助,例如 strtok() strsep()

您将需要一个输入缓冲区,您可以分配或使用一个数组(我将使用数组)。当函数解析输入字符串时,您可以将单词的地址放到 char 指针数组中。您也可以建立一个链表。

最后,您必须缓冲输入,这增加了操作的复杂性。尽管如此,优秀的C程序员还是无法应付。玩得开心。