2017-02-18 27 views
-2

各文の最初の文字を文字列で大文字にするプログラムを作成する必要があります。たとえば、文字列引数が "hello"の場合私の名前はジョー。あなたの名前は何ですか? "という文字列を操作する必要があります。私の名前はジョー。あなたの名前は何ですか? "私は何が間違っているのか分かりません。助言がありますか?ここに私のコードは次のとおりです。コメントで述べたように各文の最初の単語を大文字にする

#include<iostream> 
#include<cctype> 
#include<cstdlib> 

using namespace std; 

void capitalize(char sentence[], int const SIZE); 

int main() 
{ 
    const int SIZE = 1024; 
    char sentence[SIZE]; 

    cout << "Enter a string: " << endl << endl; 
    cin.getline(sentence, SIZE); 

    capitalize(sentence, SIZE); 

    system("pause"); 
    return(0); 
} 

void capitalize(char sentence[], int SIZE) 
{ 

    char *strPtr; 
    int count = 0; 

    sentence[0] = toupper(sentence[0]); 

    for (int i = 0; i < SIZE; i++) 
    { 
     strPtr = strstr(sentence[i], "."); 

     if (*strPtr == '.') 
     { 
        *strPtr = toupper(*strPtr); 
     } 
    } 

    while (sentence[count] != '\0') 
    { 
      cout << sentence[count]; 
      count++; 
    } 
} 
+1

コードではどのような出力が生成されますか? – Fallen

+0

@Fallen 'strstr'がこのスコープで宣言されていないというエラーメッセージが表示されます。 – PAXlater

+1

いくつかのヒント:1)CまたはC++を書くかどうかを決めます。 2)SIZEに達するまでループすると、ユーザーが入力したものの最後を過ぎる可能性が高くなります。 –

答えて

0

まず、あなたはcstring含めていません。次に、のstrstrをcharと呼んでいます。あなたは、char *であるsentence + iが欲しいです。これで構文エラーが修正されます。

論理的なエラーのため、あなたはtoupperの期間を試しているようです。

strPtr = strstr(sentence[i], ".");文字列の最初のピリオドは、i(これを含む)で始まるはずです。次に、strstrが何かを見つけたかどうかを調べます(そうでない場合はnullを返します)。シーケンスが見つかった場合はstrPtrが大文字になりますが、strPtrはまだターゲット文字列の最初の文字を指しています。つまり、'.'です。ターゲット文字列". "次の文の最初の文字を見つけるために1をインクリメントします。残念ながら、strstrでそれを行う安全な方法はありません。文字列のどれくらいまで見えているかわからないので、文字列は単に". "で終わります。 1つ前の配列が配列から脱落した場合は、配列を手動で繰り返し処理する必要があります。'.'を探したり、それをチェックしたり、std::findを代わりに使用してください。

1
#include <cstring> // need this for strstr() 

void capitalize(char sentence[], int SIZE) 
{ 

    char *strPtr; 
    int count = 0; 

    sentence[0] = toupper(sentence[0]); 

    for (int i = 0; i < SIZE; i++) 
    { 
     strPtr = strstr(&sentence[i], "."); 
     //strPtr returns the pointer to 
     //the first occurence of "." after sentence[i] 
     if(strPtr==NULL) break; 
     if (*strPtr == '.') 
     { 
      // you really dont want to do this 
      //*strPtr = toupper(*strPtr); 
      // put the suitable code here and everything will work 
     } 
    } 
    //why the while loop? and count? 
    while (sentence[count] != '\0') 
    { 
      cout << sentence[count]; 
      count++; 
    } 
} 

あなたがしていたことは、 "。"を大文字にすることでしたが、次の文字を大文字にすることを明確にしたいと思います。だから、コードのその部分を自分で書いてみると、より多くの報酬を得ることができます。

関連する問題