1

基本的にピリオドの後に文字を大文字にするコードを書いているのですが、なぜかテストするたびに、コマンドプロンプトに何か入力すると、リターンキーを押した後にプログラムが停止してしまいます。どんな助けでも大歓迎ですありがとう。ループが壊れるまで無限になることを意図していることは承知しています。ループが壊れる条件が満たされるまで、大文字化のプロセスが続くという考えです。

                if ((text.empty() != 1 ) && (text.at(text.size() - 1) != '!' ) && (text.at(text.size() - 1) != '?') && (text.at(text.size() - 1) != ':' ) && (text.at(text.size()-1 ) != ',' ) && (text.at(text.size() - 1 ) != ';' ) && (text.at(text.size() -1 ) != '=' ) && (text.at(text.size() -1 ) != '-' ) && (text.at(text.size() -1 ) != ')' ) && (text.at(text.size() -1 ) != '}' )  )
        {
            for (i = 0 ;  i >= 0 ; i++)
        {
            text.append("kk") ;
            if (text.find("." , j) < 0 )
                {
                    text.erase(text.size() - 1, 2) ;
                    text2.append(text) ;
                    writer << text2 << endl ;
                    text2.clear() ;
                    j = 0 ;
                    break ;
                }
                else
                {
                    j = text.find("." , j) + 1 ; 
                    k = j + 1;
                    letter = static_cast <int> ( text.at(k) ) ;
                    if (( letter < 123 ) && ( letter > 96 ))
                        {
                            letter = (letter - 32) ;
                            (text.at(k)) = static_cast <char> (letter) ;
                            text.erase(text.size() - 1, 2) ;
                        }
                    else 
                        {
                            text.erase(text.size() - 1, 2) ;
                            continue ; 
                        }
                }
        }
        }
        else 
        if (text == "")
        {
            text2.append("\n") ;
            writer << text2 << endl ;
            text2.clear() ;
        }
        else 
        {
            text2.append(text) ;
            writer << text2 << endl ;
            text2.clear() ;
        }
    }
4

2 に答える 2

0

いくつかのヒント。

オートフォーマットを使用します。あなたのフォーマットは、私がそれをvimに投げて=する前にいたるところにありました。バグを見つけるのに役立ちます。

2番、

if ( (text == "end") || (text == "End") || (text == "ENd") || (text == "END") ) 

tolowerメソッドまたはメソッドを使用して、toupper大文字と小文字を区別せずに比較します。

if (text == "19823717")

これをマジックナンバーとして使用して、ループを初めて検出するようです。代わりに、このロジックをループの外に移動してください。

if ( (text == "end") || (text == "End") || (text == "ENd") || (text == "END") ) 
  {
    writer.close() ;
    cout << "End of session" << endl ; break ;
  }
  else 
    if (...

ここにある他のものは私を怖がらせます。意図したとおりに動作しない可能性があります。これをラップしたほうがいいかもしれません{}s

letter = static_cast <int> ( text.at(k) ) ;

このキャストは必要ありません。Acharは数値として直接扱うことができます。 char a = 97;例えば。

if (( letter < 123 ) && ( letter > 96 ))

toupper代わりに使用してください。

それを超えて。あなたの問題が実際に何であるかはわかりません。これらの他の問題を解決するにつれて明らかになる微妙な論理エラーである可能性があります。

于 2013-09-18T14:42:42.100 に答える