2017-01-29 24 views
0

このプログラムでは、単語ごとに小文字、空白などを使わないようにしています。しかし、私の文字列「temp」には何も保持されていません。私はそれを変更しようとしている方法のためですか?多分私は代わりにchar *を使ってみるべきですか?申し訳ありませんが、これはばかげた質問ですが、私はC++の新機能ですが、数時間デバッグしようとしていましたが、これほど多くの検索を見つけることはできません。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

あなたはoperator[]stringに追加することはできません。あなたは既にそこにあるものだけを変更することができます。 tempが空に作成され、定期的にクリアされるので、[]を使用することは未定義です。文字列の長さはゼロです。したがって、インデックスは範囲外です。そこには何もないかもしれません。プログラムがこの乱用から生き残っても、文字列の長さはゼロになる可能性が高く、stringでの操作は何も起こりません。

が扱う文字列あなたがstd::vectorpush_back

temp.push_back(tolower(content[i])); 

または

std::stringstreamをビルドアップするのと同じ方法:

OPが現在持っているものを踏まえて

、私は2つの簡単なオプションを参照してください

stream << tolower(content[i]) 

と文字列に結果を変換string sは彼らがどのくらい知っているよう終え

string temp = stream.str(); 

どちらのアプローチがjカウンターが不要になります。

しかし、OPは引くと、この全体の問題を回避endrunと一発で文字列全体を変換するためにstd::transform

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

を使用して、substringと下部ケースstringを分割することに集中することができます。 ::tolowerの前にあるコロンは、標準ライブラリの適切な名前空間はOPが言葉に周波数カウントを実行しているように見える、オフトピックusing namespace std;

でオフになっているので、他のtolowersとの混同を防ぐためにあります。 std::map<string, int> distinct;をご覧ください。収集と比較のテストを減らすことができます

distinct[temp]++; 
関連する問題