Stack Smashing并使用malloc

时间:2017-11-23 21:47:59

标签: c

我正在制作一个计算文件中包含的单词数量的程序。我的代码适用于某些测试用例,其中包含少于一定数量的单词/字符的文件......但是当我测试它时,让我们说一句话:

" loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong&#34 ;,(这不是随机 - 这是我&#39的实际测试案例; M要求检查),它给我这个错误:

*** stack smashing detected ***: ./wcount.out terminated
Abort (core dumped)

我知道错误意味着什么,我必须实现某种malloc代码行才能分配适量的内存,但我无法弄清楚我的函数放在哪里或者该怎么做:

int NumberOfWords(char* argv[1]) {
  FILE* inFile = NULL;
  char temp_word[20]; <----------------------I think this is the problem

  int num_words_in_file;
  int words_read = 0;

  inFile = fopen(argv[1], "r");

  while (!feof(inFile)) {
    fscanf(inFile, "%s", temp_word);
    words_read++;
  }
  num_words_in_file = words_read;

  printf("There are %d word(s).\n", num_words_in_file - 1);
  fclose(inFile);
  return num_words_in_file;

}

3 个答案:

答案 0 :(得分:0)

由于您通过呈现源代码无效而正确识别(未来提示:/* put your arrows in comments */),问题是temp_word只有足够的空间容纳20个字符(其中一个必须是终止空字符)。

此外,您应该检查fopen的返回值。我会把它作为锻炼给你。我已经在其他问题(例如this one)中回答了这个问题,但我不认为只是将代码推到脸上会对你有帮助。

在这种情况下,我认为更好地分析您所遇到的问题可能会付出代价,看看您是否确实需要存储单词来计算它们。当我们定义单词(由scanf("%s", ...)读取的那种非空白字符序列后跟一系列(零个或多个)空白字符时,我们可以看到这样的< em>计算计划,因为您需要遵循以下程序:

  1. 尽可能多地阅读空白
  2. 尽可能多地阅读非空白
  3. 增加&#34;字&#34;如果一切都成功,反击
  4. 您不需要存储非空白空间,因为一旦您阅读了它,您就永远不会重新访问它。因此你可以把它写成两个嵌入到一个循环中的循环:一个循环读取尽可能多的空白,另一个读取非空格,然后是你的增量,然后外循环重复整个批次......直到{{1}到达了......

    使用EOF指令可以最好地实现这一点,该指令告诉%*s相关函数不要尝试存储。例如:

    scanf

答案 1 :(得分:0)

您受到阵列大小的限制。一个简单的解决方案是增加阵列的大小。但如果有人输入一个长篇大论,你总是容易受到砸碎。

单词由空格分隔。

您可以简单地存储一个初始化为零的计数器变量,以及一个记录您正在查看的当前char的变量。每次使用fgetc(inFile, &temp)作为空格读取角色时,都会增加计数器。

答案 2 :(得分:-1)

你的方法可以带来好的结果,但它有点激烈。您不应该直接从文件中读取单词,而是读取行,并计算这些行中的单词。我建议您查找有关 fgets strtok 的信息(如果需要,可以不用 strtok 制作)。