2016-04-05 6 views
0

私の仕事は、毎回の実行中にランダムな文字列を送るテストドライバで動作するように自分の関数を記入することです。この機能のためには、すべての単語の最初の文字を大文字に変換しなければならず、その他はすべて低くする必要があります。cstringをcamelcaseに変換する

は、それは主に動作しますが、私は私のコードで抱えている問題は、それは非常に最初の文字を大文字にしないことで、期間は次のように単語の前に存在する場合:

.WORD

この場合、「w」は低いままです。ここで

は私のソースです:

void camelCase(char line[]) 
{ 
    int index = 0; 
    bool lineStart = true; 

    for (index;line[index]!='\0';index++) 
    { 
     if (lineStart) 
     { 
      line[index] = toupper(line[index]); 
      lineStart = false; 
     } 

     if (line[index] == ' ') 
     { 
      if (ispunct(line[index])) 
      { 
       index++; 
       line[index] = toupper(line[index]); 
      } 
      else 
      { 
       index++; 
       line[index] = toupper(line[index]); 
      } 
     }else 
      line[index] = tolower(line[index]); 
    } 
    lineStart = false; 

} 
+0

私はこのロジックがタスクを考えれば過度に複雑であると言います... –

+0

より多くの論理フラグを使用してください。次のインデックスにスキップしないでください。そうしないと、文字列の最後を過ぎて書き込まれません。 – kay

+0

ユージン、私は知っています。私のコードが完璧だったら私はここにいません。 – RyeMan

答えて

0

はここで動作するはずソリューションですし、少しより複雑で、私の意見である:

#include <iostream> 
#include <cctype> 

void camelCase(char line[]) { 
    bool active = true; 

    for(int i = 0; line[i] != '\0'; i++) { 
     if(std::isalpha(line[i])) { 
      if(active) { 
       line[i] = std::toupper(line[i]); 
       active = false; 
      } else { 
       line[i] = std::tolower(line[i]); 
      } 
     } else if(line[i] == ' ') { 
      active = true; 
     } 
    } 
} 

int main() { 
    char arr[] = "hELLO, wORLD!";  // Hello, World! 
    camelCase(arr); 
    std::cout << arr << '\n'; 
} 

次の文字を変換する必要があるかどうかの変数activeトラック大文字に手紙を大文字に変換すると、activeは偽になり、プログラムは文字を小文字に変換し始めます。空白がある場合はactiveがtrueに設定され、プロセス全体が再び開始されます。

+0

それはまさにそれです。助けてくれてありがとう! – RyeMan