我已经在这里呆了几个小时,我很难读到我的文本文件,计算每个单词有多少个字母,每个字母数量的字数。
到目前为止,我已经想出了这个:
#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分隔的英文单词;
答案 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};
到我的文件顶部,不再输出转储内存。
感谢所有帮助:)