所以在这个程序中,我试图逐字逐句地使它只用小写字母,没有空格或其他任何东西。但是,我的字符串“temp”并没有包含任何内容。是因为我试图修改它的方式吗?也许我应该尝试使用char *代替?对不起,如果这是一个愚蠢的问题,我是c ++的新手,但我一直在尝试调试它几个小时,找不到太多的搜索。
#include <string>
#include <iostream>
#include <fstream>
#include <ctype.h>
using namespace std;
int main(int argc, char* argv[]) {
/*if (argc != 3) {
cout << "Error: wrong number of arguments." << endl;
}*/
ifstream infile(argv[1]);
//infile.open(argv[1]);
string content((std::istreambuf_iterator<char>(infile)),
(std::istreambuf_iterator<char>()));
string final;
string temp;
string distinct[5000];
int distinctnum[5000] = { 0 };
int numdist = 0;
int wordcount = 0;
int i = 0;
int j = 0;
int k = 0;
int isdistinct = 0;
int len = content.length();
//cout << "test 1" << endl;
cout << "length of string: " << len << endl;
cout << "content entered: " << content << endl;
while (i < len) {
temp.clear();
//cout << "test 2" << endl;
if (isalpha(content[i])) {
//cout << "test 3" << endl;
if (isupper(content[i])) {
//cout << "test 4" << endl;
temp[j] = tolower(content[i]);
++j;
}
else {
//cout << "test 5" << endl;
temp[j] = content[i];
++j;
}
}
else {
cout << temp << endl;
//cout << "test 6" << endl;
++wordcount;
final = final + temp;
j = 0;
for (k = 0;k < numdist;k++) {
//cout << "test 7" << endl;
if (distinct[k] == temp) {
++distinctnum[k];
isdistinct = 1;
break;
}
}
if (isdistinct == 0) {
//cout << "test 8" << endl;
distinct[numdist] = temp;
++numdist;
}
}
//cout << temp << endl;
++i;
}
cout << wordcount+1 << " words total." << endl << numdist << " distinct words." << endl;
cout << "New output: " << final << endl;
return 0;
}
答案 0 :(得分:1)
您无法使用string
添加到operator[]
。您只能修改已存在的内容。由于temp
已创建为空且已定期清除,因此使用[]
未定义。字符串长度为零,因此任何索引都超出范围。可能根本没有任何东西。即使程序设法在这种滥用中存活下来,字符串长度仍可能为零,string
上的操作将不会发生任何事情。
与OP目前的情况一致,我看到两个简单的选择:
以与std::vector
和push_back
temp.push_back(tolower(content[i]));
或
stream << tolower(content[i])
并在完成后将结果转换为字符串
string temp = stream.str();
这两种方法都不需要j
计数器,因为string
知道它们有多长。
然而,OP可以拉动并结束整个问题并使用std::transform
std::transform(content.begin(), content.end(), content.begin(), ::tolower);
一次性转换整个字符串,然后集中精力将小写string
与substring
分开。 ::tolower
前面的冒号是为了防止与其他tolowers
混淆,因为标准库的正确名称空间已被using namespace std;
偏离主题,看起来OP正在对单词执行频率计数。查看std::map<string, int> distinct;
。您可以将收集和比较测试减少到
distinct[temp]++;