【问题标题】:Storing and outputting word.length() into an array将 word.length() 存储并输出到数组中
【发布时间】:2016-08-14 06:37:32
【问题描述】:

我已经在这工作了几个小时,我很难读入我的文本文件,计算每个单词有多少个字母,每个字母的单词数量。

到目前为止,我已经想到了这个:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <string>
#include <fstream>

using namespace std;

const int array_size = 29;

int main() {

ifstream inputfile;
string word, word2;
int wordlength[array_size];
int length = 0;

cout << left << setw(10) << "Length: ";
cout << left << setw(10) << "# of words: " << endl;

inputfile.open("C:/EnglishWords.txt");

while (inputfile) {

    inputfile >> word;

    int len = word.length(); 
    wordlength[len]++; //initialized array for '29'

    for (int i = 1; i < 29; i++) {
        cout << left << setw(10) << wordlength[i];
        cout << left << setw(10) << i;
    }
}

getchar();
getchar();

return 0;
}

对于我想要打印的每个实际值,我基本上得到了 -8293729 的变体(我假设这是垃圾内存)。我真的可以在这个上使用stackoverflow的力量,因为我很难过:/。

编辑:我正在阅读的文件是由 /n 分隔的“所有”英文单词的列表;

【问题讨论】:

  • 除了嵌套的for 循环(哦,那是缺少的}?感谢minimal reproducible example)和检查流中的错误之前提取,你没有' t 向我们展示错误。 wordlength 可能有未初始化的元素。应该是std::map...
  • 您好,感谢您的回复。我确实在我的 while 循环末尾添加了“}”。所以这不是问题。通过提供 int main() 部分以便您可以编译它,我对如何向您显示错误感到有点困惑?另外,我是编码新手,我对如何实现地图有点困惑,我查了一下,但还是有点迷茫。再次感谢您的回复!
  • 这个while 循环应该是while( inputFile &gt;&gt; word) { ... }
  • 由于您添加了丢失的},您的代码在您的问题中没有正确呈现,您能解决它吗?
  • 我修复了“{”问题

标签: c++ file-io count static-libraries string-length


【解决方案1】:

首先,您的wordlentgth 数组未初始化。 在递增之前尝试使用 for 循环将其内容设置为 0。或者,更好的是,使用memset

int wordlength[array_size];
memset(wordlength, 0, array_size);

编辑:int wordlength[array_size] = {0}; 在这种情况下是要走的路。例如,memset 在您必须重新设置数组时很有用。

您需要#include &lt;cstring&gt; 才能使用它。

其次,如果任何单词大于array_size,你的程序将因为分段错误而崩溃(你应该查一下,如果你用 C/C++ 编程,这将是你遇到的最常见的错误) .为了避免这个错误,只需确保 len 小于 array_size 在递增 wordlength[len] 之前通过将增量包装在 if 中:

int len = word.length(); 
if(len < array_size) {
    wordlength[len]++;
} else {
    cerr << "A word was ignored because it was too long: \"" << word << "\"\n";
}

最后,您应该阅读一些有关命名约定的内容。这确实是一个偏好问题,但只是尽量保持一致(即wordlength 不遵循与array_size 相同的约定)。你写array_size的方式叫做snake-case,我个人很喜欢,但是C语言家族的主流风格是CamelCase。 关于样式的另一个注意事项:ok 可以使用全局常量,但确实建议将其命名,以便明确它是一个常量:ARRAY_SIZE 而不是 array_size

另外,正确缩进您的代码。更好的是,使用可以自动缩进代码的编辑器。

【讨论】:

  • 非常感谢所有的建议。我确实使用 Visual Studio 并保持它的格式,但是当我将代码粘贴到框中时,我必须缩进 4 个空格,这会搞砸一切。我一定会读到所有这些东西。谢谢!我将尝试初始化,看看会发生什么,此外,我将尝试将“len”设置为 0 以使其“小于”数组大小?感谢您的帮助!
  • 值初始化 wordlength 是否足以将其初始化为 0?例如:int wordlength[array_size]{}int wordlength[array_size] = {0}?
  • @KABoissonneault 你完全正确,我忘了,傻我
  • 嘿,所以我找到了解决问题的方法,我所做的只是改变了 int wordlength [array_size] = {0},一切正常。我也是这个网站的新手,我应该将其标记为已解决吗?或者发布我的最终代码让人们知道我修复了它?
  • @Complexicator,我编辑了我的答案,以更好地解释“确保 len 小于 array_size”的意思。另外,我添加了 KABoissoneault 所说的内容。
【解决方案2】:

我只是想澄清一下,我通过初始化数组解决了我的问题。

我补充说:

int wordlength[array_size] = {0};

到我的文件顶部,不再输出转储内存。

感谢所有帮助:)

【讨论】:

    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2014-09-13
    • 2019-12-16
    • 2017-06-25
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多