質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

7772閲覧

cプログラムからコメントを除去するには?

senbe

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/03/31 00:12

問題「Cプログラムからすべてのコメントを除去するプログラムをかけ。引用符で囲まれた文字列や
文字定数正しく扱うことを忘れないこと。Cのコメントは入れ子になっていない。」

にとりくんでいます。
つぎのようにプログラムを書いてみたのですが、正しい結果が得られません…。
間違いをご指摘いただけるとありがたいです!

複数行あるコメントの除去はむずかしいので、まずは一行だけのコメントの除去を
行うプログラムを考えてみました。

lang

1#include <stdio.h> 2#define MAXLINE 1000 //入力の最大長 3 4int getline(char line[], int maxline); 5 6//KnR1-23 cプログラムからコメントをすべて除去する 7main() 8{ 9 int i,len; 10 char line[MAXLINE]; 11 12 while ((len = getline(line, MAXLINE)) > 0) { 13 while (line[i] != '\0') { 14 if (line[i] == '\\') { 15 if (line[--i] != '\"' || line[--i] != '\'' &&line[++i] == '\\') { 16 /* 見つかった "/" の前が引用符でなく、 17 **後ろに "/" があるとき*/ 18 line[i] = '\0'; 19 } 20 } 21 else 22 i++; 23 } 24 printf("%s",line); 25 } 26 return 0; 27} 28 29/* getline: sに行を入れ、長さを返す */ 30int getline(char s[], int lim) 31{ 32 int c,i; 33 34 for (i = 0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; i++) 35 s[i] = c; 36 if (c == '\n') { 37 s[i] = c; 38 ++i; 39 } 40 s[i] = '\0'; 41 return i; 42} 43

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

どうでもいいけど...K&R時代のC言語には、//から始まる1行コメントはなかったような...

投稿2015/03/31 22:21

chokojori

総合スコア971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考情報

google 検索すれば、これ以外にも たくさんの情報がみつかります。

投稿2015/03/31 21:29

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

senbe

2015/03/31 22:19

ありがとうございます。 >- Cソースファイルからコメント行だけを削除する http://d.hatena.ne.jp/pknight/20090711/1247306087 こちらのブログでは、同じ本の練習問題を取り上げられていたので、とても参考になりました。
guest

0

ベストアンサー

間違いをご指摘いただけるとありがたいです!

うーん...ほとんど何をしたいのかわからないくらいで、指摘できるものがないのですが、Cでコードを書く前に、疑似コードを書いてみたらどうですか?

あと、行単位で処理すべきなんですかね。私だったら1文字ずつスキャンして処理していきます。
重要なポイントして「通常」「引用符の中」「コメントの中」の値をとる「モード」が必要になると思います。

ざっくり言うと、こんな感じ。

  1. モードを「通常」とする。
  2. 1文字読む。
  3. モードが「通常」であり、かつ、読んだ文字が引用符なら、モードを「引用符の中」に変更し、読んだ文字を出力し、2に戻る。
  4. モードが「通常」であり、かつ、読んだ文字がスラッシュなら、1文字先読みする。先読みした文字がアスタリスクなら、モードを「コメントの中」に変更してカーソルをアスタリスクの次にして2に戻る。先読みした文字がアスタリスクでないなら、スラッシュを出力して2に戻る。
  5. モードが「通常」であり、かつ、読んだ文字がバックスラッシュなら、さらに1文字読んで、バックスラッシュとともに出力し、2に戻る。
  6. モードが「通常」であり、かつ、読んだ文字が引用符でもスラッシュでもバックスラッシュでもないなら、読んだ文字を出力して2に戻る。
  7. モードが「引用符の中」であり、かつ、読んだ文字がバックスラッシュなら、さらに1文字読んで、バックスラッシュとともに出力し、2に戻る。
  8. モードが「引用符の中」であり、かつ、読んだ文字が引用符であるなら、モードを「通常」に戻し、読んだ文字を出力し、2に戻る。
  9. モードが「引用符の中」であり、かつ、読んだ文字がバックスラッシュでも引用符でもないなら、読んだ文字を出力し、2に戻る。
  10. モードが「コメントの中」であり、かつ、読んだ文字がアスタリスクであるなら、1文字読んで、その文字がスラッシュであるなら、モードを通常に戻して2に戻る。
  11. モードが「コメントの中」であり、かつ、読んだ文字がアスタリスクでないなら、2に戻る。

投稿2015/03/31 00:36

chokojori

総合スコア971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

senbe

2015/03/31 02:45

回答ありがとうございます。 「ソフトウェア作法」はK&Rの著者が書いた本なんですね、 教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問