aboutsummaryrefslogtreecommitdiff
path: root/ch1/1-23_decomment.c
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-04-23 13:33:25 -0500
committerzlg <zlg@zlg.space>2013-04-23 13:33:25 -0500
commit82d318879c897b3d665767d74806cd33fe6791c0 (patch)
treea3d2f41ef4e1d11136a3088784c59c604c20e47d /ch1/1-23_decomment.c
parentSolve Exercise 3-6: itoa (3 arg version) (diff)
downloadknr-82d318879c897b3d665767d74806cd33fe6791c0.tar.gz
knr-82d318879c897b3d665767d74806cd33fe6791c0.tar.bz2
knr-82d318879c897b3d665767d74806cd33fe6791c0.tar.xz
knr-82d318879c897b3d665767d74806cd33fe6791c0.zip
Add exercise descriptions and answers for ch1
* Corrected behavior in solutions for 1-9 and 1-23
Diffstat (limited to 'ch1/1-23_decomment.c')
-rw-r--r--ch1/1-23_decomment.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/ch1/1-23_decomment.c b/ch1/1-23_decomment.c
index 63193cd..d9c5c90 100644
--- a/ch1/1-23_decomment.c
+++ b/ch1/1-23_decomment.c
@@ -1,28 +1,29 @@
#include <stdio.h>
/* The C Programming Language: 2nd Edition
- * Exercise 1-23:
- * "Write a program to remove all comments from a C program. Don't forget to
- * handle quoted strings and character constants properly. C comments do not
- * nest."
*
- * I'm not sure why the instructions tell the reader to account for quoted
- * strings and character constants. Comments always begin with either // or
- * /*, so that sets the boundary of state.
+ * Exercise 1-23: Write a program to remove all comments from a C program.
+ * Don't forget to handle quoted strings and character constants properly. C
+ * comments do not nest.
+ *
+ * Answer: At first I didn't know why it was important to account for strings
+ * or character constants. The reason behind this is that /* and // are valid
+ * inside those parts of C, so they deserve special treatment.
*
* The states for this program are IN_MULTI for a multi-line comment,
- * IN_SINGLE for a single line comment, and OUT for being outside a comment.
- * These three states are all I need to determine whether I should output the
- * contents of the C file or not. Characters are only output when the state is
- * OUT, and there are conditions for getting into and out of comment state.
+ * IN_SINGLE for a single line comment, OUT for being outside a comment, and
+ * IN_STRING for being inside a string or character constant. These four states
+ * are all I need to determine whether I should output the contents of the C
+ * file or not. Characters are only output when the state is OUT or IN_STRING,
+ * and there are conditions for getting into and out of comment state.
*
- * I don't know of any other way to do this without invoking some higher-level
- * libraries.
+ * This structure is known as a finite state machine (FSM).
*/
+#define OUT 0
#define IN_MULTI 1
#define IN_SINGLE 2
-#define OUT 0
+#define IN_STRING 3
char c, p;
int status;
@@ -30,7 +31,14 @@ int status;
int main() {
// Treat input like a stream, since that's all the K&R has explained so far.
while ((c = getchar()) != EOF) {
-
+ /* This is to account for strings and character constants */
+ if (c == '\'' || c == '"') {
+ if (status == OUT) {
+ status = IN_STRING;
+ } else if (status == IN_STRING) {
+ status = OUT;
+ }
+ }
// Check for the ways to open a comment, and set state accordingly
if (c == '/' && status == OUT) {
// Look ahead and store the character that's returned
@@ -70,7 +78,7 @@ int main() {
}
// Output everything when we're not in a comment!
- if (status == OUT) {
+ if (status == OUT || status == IN_STRING) {
putchar(c);
}
/td> 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5