2016-09-10 24 views
0

C++が新しくなったので、ここでは私が取り組んでいるプロジェクトの一部です。文字列を使用して、最も頻繁に使用される数値と何回使用されたかを印刷します。私はこれが正しいと思ったが、何らかの理由で私のchar配列は読み込まれません。どのように修正するためのヒントや提案?文字列を文字配列に変換する

#include <string> 
#include <iostream> 

using namespace std; 

char getMostFreqLetter(string ss); 

int main() { 
    string s; //initilizing a variable for string s 
    s = ("What is the most common letter in this string "); // giving s a string 

    getMostFreqLetter(s); // caling the function to print out the most freq Letter 

    return 0; 
} 

char getMostFreqLetter(string ss) { 
    int max, index, i = 0; 
    int array[255] = {0}; 
    char letters[]; 

    // convert all letters to lowercase to make counting letters non case sensative 
    for (int i = 0; i < ss.length(); i ++){ 
     ss[i] = tolower(ss[i]); 
    } 

    //read each letter into 
    for (int i = 0; i < ss.length(); i ++){ 
     ++array[letters[i]]; 
    } 
    // 

    max = array[0]; 
    index = 0; 
    for (int i = 0; i < ss.length(); i ++){ 
     if(array[i] > max) 
     { 
      max = array[i]; 
      index = i; 
     } 
    } 

    return 0; 
} 
+0

空白を最も頻繁な手紙と考えていますか? – Shravan40

+0

コンパイラで警告レベルを上げてください。 char letters [];に 'error:storage size of 'の文字が分からないようなものが必要です。 –

+0

私は正直なところ、ssに渡す文字列を使用します。文字列は '[] '演算子を使って配列のようにアクセスできます。これが何らかの学習のためのもので、 'char letters []'を 'chars [ss.size()]'に変更すれば、この問題を解決することができます。 – George

答えて

-1

コードにいくつかの誤りがあります。

最初に、文字配列lettersは完全に使用されません。それを無視し、代わりに文字列ssを反復する必要があります。これはあなたが意図したものです。

これは、2番目のforループを++array[letters[i]];から++array[ss[i]];に変更します。

第2に、あなたの最後のforループはバグです。あなたは配列の頻度を探すためにインデックスとしてiを使いますが、文字のascii値(ss [i])を使う必要があります。あなたは手紙のようにホワイトスペースを考慮していない場合

Most freq character: t 
+0

なぜそれをする前に投票を停止しているのか説明することは良いことです。 – gowrath

+0

私はdownvotedしていないが、追加の中括弧は、getMostFreqLetter()関数の後にあったと私はこれを推測する "まず、char文字[100]または任意の適切な数のようないくつかのサイズで配列文字を初期化する必要があります。あなたは文字をまったく使用していません。ちょうどそれをssに置き換えてください。あまり説明的ではありません。これらは唯一の愚痴ですが、私はこの答えに同意する傾向があります。 – George

+0

@George入力をありがとう。実際には、このコードには最初に考えたよりも大きなエラーがあります。上に固定。 – gowrath

1

:あなたは、文字列上で実行するときに、次の出力を得る上で変更を加えたら

index = ss[0]; 
    max = array[index]; 
    for (int i = 0; i < ss.length(); i ++){ 
     if(!isspace(ss[i]) && array[ss[i]] > max) 
     { 
      max = array[ss[i]]; // you intended to use the ascii values of the characters in s to mark their place in array. In you code, you use i which is the just the index of the character in s as opposed to the ascii value of that character. Hence you need to use array[ss[i]]. 
      index = ss[i]; 

     } 
    } 
    return index; 

:ここでコメントして固定されたバージョンです。

そして、より効率的な方法は、使用string::c_str()

vector<int> count(26,0); 
for (int i = 0; i < s.length(); i++) { 
    int range = to_lower(s[i])-'a'; 
    if (range >= 0 && range < 26) 
     count[range]++; 
} 

// Now you can do fix the max while iterating over count; 
+0

それは外に出るのではないですか? – gowrath

+0

gowrath:そうは思わない。それがどこで失敗するか説明してください。 – Shravan40

+0

s [i]が空白の場合、ascii値は32です。count [32-97] noにアクセスしようとしますか? – gowrath

0

だったかもしれません。 文字列を文字配列に変換します。

+0

質問には良いタイトルはありませんが、実際に文字列を文字配列に変換する特定の関数を求めているわけではありません。 – George

関連する問題