将word.length()存储并输出到数组

时间:2016-08-14 06:37:32

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

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

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

#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的强大功能,因为我很难过:/。

编辑:我正在阅读的文件是一个&#34;所有&#34;由/ n分隔的英文单词;

2 个答案:

答案 0 :(得分:1)

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

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

编辑:int wordlength[array_size] = {0};是这种情况下的方法。例如,当您必须重新设置数组时,memset非常有用。

您需要#include <cstring>才能使用它。

其次,如果任何单词大于array_size,你的程序会因为分段错误而崩溃(你应该查找它,如果用C /编程,它将是你遇到的最常见的错误C ++)。为了避免这个错误,只需确保len小于array_size,然后通过将增量包装在if:

中来递增wordlength[len]
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

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

答案 1 :(得分:0)

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

我补充说:

int wordlength[array_size] = {0};

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

感谢所有帮助:)