0

getline() を使用して .cpp ファイルを開きます。

getline(theFile, fileData);

getline() が C++ コメント (/*, */および//)を取得しないようにする方法があるかどうか疑問に思っています。

これまでのところ、このようなことを試してもうまくいきません。

if (fileData[i] == '/*')
4

3 に答える 3

4

コメントを読むのはやむを得ないと思いますが、ファイルを一文字ずつ読むことで処分できます。

これを行うには、ファイルを文字列にロードし、次の状態でステート マシンを構築します。

  1. これは実際のコードです
  2. 前のキャラは/
  3. 前のキャラは*
  4. 私は一行コメントです
  5. 私は複数行のコメントです

ステート マシンはステート 1で開始します。

マシンが状態 1にあり、文字をヒットすると、状態 2/に遷移します。

マシンが状態 2にあり、文字をヒットすると、状態 4/に遷移します。それ以外の場合は、状態 1に遷移します。

マシンが状態 2にあり、文字をヒットすると、状態 5*に遷移します。それ以外の場合は、状態 1に遷移します。

マシンが状態 4にあり、改行文字にヒットした場合、状態 1に遷移します。

マシンが状態 5にあり、文字をヒットすると、状態 3*に遷移します。

マシンが状態 3にあり、文字をヒットすると、状態 1/に遷移します(複数行のコメントが終了します)。それ以外の場合は、状態 5に遷移します。

マシンがコメント状態に出入りする文字の位置をマークすると、文字列からこれらの文字を取り除くことができます。

または、この種のステート マシンを非常に簡潔に記述する方法を提供する正規表現を調べることもできます。

于 2013-10-07T22:22:45.263 に答える
3

したがって、1 つの問題は、が と等しいif(fileData[i] == '/*')かどうかをテストすることです... ではありません。char fileData[i]'/*'char

行にコメントが含まれているかどうかを確認するには、おそらく次のいずれかを調べる必要があります。

  • <regex>C++11 で(Boost には正規表現ライブラリもあります。それが必要な場合)。
  • strstrバニラ C/C++ で。

複数行のコメントの場合、おそらく、前の行の状態が「コメント中」かどうかを示すフラグを保存し、そのフラグに従って検索/*または更新して、更新するようなものを保存する必要があります。*/

于 2013-10-07T22:11:34.313 に答える
0

単一引用符はを示しcharcharデータ型は単一の '/*' を表しますが、char.意味がありません。charfileData[i]char

あなたのif声明ははるかに堅牢である必要があります。

于 2013-10-07T22:10:51.463 に答える