From d3ce211f149c156778730f8dc81f95b2c9f04882 Mon Sep 17 00:00:00 2001 From: Reina Harrington-Affine Date: Thu, 14 Aug 2025 22:32:02 +0000 Subject: [PATCH] Implemented a suggestion from Affine to replace the many if statements with a single switch and only ever call getchar at one point in the code. --- KNR C/ex1_10_goto.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/KNR C/ex1_10_goto.c b/KNR C/ex1_10_goto.c index f79f477..569bcd1 100644 --- a/KNR C/ex1_10_goto.c +++ b/KNR C/ex1_10_goto.c @@ -1,34 +1,31 @@ #include -#include - /*A really silly way to complete exercise 1-10 of KNR C*/ int main(){ - int a = getchar(); /*There is, unfortuately, no immediately obvious way to avoid repeating this since we need to initialize 'a' in order to have valid data for everything beyond this line*/ - - if (a == EOF){ /*Check whether first character is EOF*/ - printf ("Error: No data to parse. \n Exiting."); - EXIT_FAILURE; /*Exit if there is no data to parse.*/ - } - loop_start: /*Goto will circle back to the next line if a != EOF*/ - if (a == '\t' || a == '\b' || a == '\\'){ - if (a == '\t') - printf("\\t"); - if (a == '\b') - printf("\\b"); - if (a == '\\') - printf ("\\\\"); - } else { - putchar(a); - } + + int a = getchar(); - a = getchar(); + switch (a){ + case EOF: + break; + case '\t': + printf("\\t"); + break; + case '\b': + printf("\\b"); + break; + case '\\': + printf("\\\\"); + break; + default: + putchar (a); + break; + } if (a != EOF) /*Only trigger next loop if 'a' contains valid data.*/ goto loop_start; - return 0; }