C ++无法修改字符串

时间:2017-01-29 22:00:10

标签: c++ string

所以在这个程序中,我试图逐字逐句地使它只用小写字母,没有空格或其他任何东西。但是,我的字符串“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;
}

1 个答案:

答案 0 :(得分:1)

您无法使用string添加到operator[]。您只能修改已存在的内容。由于temp已创建为空且已定期清除,因此使用[]未定义。字符串长度为零,因此任何索引都超出范围。可能根本没有任何东西。即使程序设法在这种滥用中存活下来,字符串长度仍可能为零,string上的操作将不会发生任何事情。

与OP目前的情况一致,我看到两个简单的选择:

以与std::vectorpush_back

相同的方式处理字符串
temp.push_back(tolower(content[i]));

建立std::stringstream

stream << tolower(content[i])

并在完成后将结果转换为字符串

string temp = stream.str();

这两种方法都不需要j计数器,因为string知道它们有多长。

然而,OP可以拉动并结束整个问题并使用std::transform

std::transform(content.begin(), content.end(), content.begin(), ::tolower);

一次性转换整个字符串,然后集中精力将小写stringsubstring分开。 ::tolower前面的冒号是为了防止与其他tolowers混淆,因为标准库的正确名称空间已被using namespace std;

关闭

偏离主题,看起来OP正在对单词执行频率计数。查看std::map<string, int> distinct;。您可以将收集和比较测试减少到

distinct[temp]++;