+ 1

Warmup.c. How to break this code?

I have been asked to write a program that receives character input from the user and prints it. The program terminates when the input is 'Q' or 'q'. Where will this code break? https://code.sololearn.com/csrLSvZ1owtN/?ref=app https://code.sololearn.com/csrLSvZ1owtN/?ref=app https://code.sololearn.com/csrLSvZ1owtN/?ref=app

28th Oct 2020, 8:58 PM
Assaf Hillel
Assaf Hillel - avatar
9 odpowiedzi
+ 5
Ipang you never really need a break, a continue or a goto (exept for the breaks in the switch cases, but you don't even really need the switch control structure). Check this https://en.wikipedia.org/wiki/Structured_program_theorem I believe it's a good practice not to use them unless in cases they save you resources, like in the case you need to exit a deeply nested loop. That's because if you fill a code with break, continue and goto statements it will be definitely harder to read for humans and thus more likely to contain bugs and requiring a bigger effort to be debugged than the same code wrote using structured programming. In this small program of Assaf there's not enough code to make the difference evident, but still it is good for him to practice structured programming.
29th Oct 2020, 11:30 AM
Davide
Davide - avatar
+ 4
Martin Taylor, Is an infinite loop which uses a break really a messy programming? taking these two illustration as example, how can we say the second is a messy programming? the first one will still execute (some instructions) before the state of <alive> is evaluated. This is not the case with the second one right? bool alive = true; do { if(some-condition) alive = false; // some instructions } while(alive); while(1) { if(some-condition) break; // some instructions }
29th Oct 2020, 4:10 AM
Ipang
+ 4
You are welcome Coder Kitten! 🐈
29th Oct 2020, 2:45 PM
Davide
Davide - avatar
+ 3
Assaf Hillel sizeof( char ) is always 1. So you can always use the number 1 instead of sizeof( char ). The fgets(input, 1, stdin) read only 1 char, but if you want to read only 1 char you can use getchar() or scanf(). If you want to read a word all at once, you can use scanf or fgets. And if you want to read an entire string made of words, numbers , spaces and characters you need fgets. I suggest you to use a loop with getchar() or scanf. In each lap of the loop you read a character, than check wether is Q and then either print the char or exit the loop.
28th Oct 2020, 9:28 PM
Davide
Davide - avatar
+ 3
Martin Taylor I should have said that "I need" fgets. Because laziness keep me away from learning the full capabilities of scanf. If I may, I would put part of the blame on the folks from stack overflow that say scaf is unsafe. But anyway thank you for correcting me.
29th Oct 2020, 2:14 AM
Davide
Davide - avatar
+ 3
Ipang You can do the following: c = getchar(); While ( c != q && c != Q ) { putchar( c ); c = getchar(); } The fact that you never really need a break has been proved. Check the link that I posted.
29th Oct 2020, 12:53 PM
Davide
Davide - avatar
+ 3
Davide You got a point 👍
29th Oct 2020, 12:55 PM
Ipang
+ 2
Davide Apart from `break`, is there any other suggested or better way(s) to exit a loop prematurely? if you read the OP's question: "... receives a character input from user and prints it. The program terminates when the input is 'Q' or 'q'". The second paragraph indicates a need for a loop, with an exit condition (input being either 'Q' or 'q'). Then in this case, a `break` is in order to exit the loop when the exit condition satisfies. So how come "you never really need a `break`"?
29th Oct 2020, 12:43 PM
Ipang
+ 2
Martin Taylor you are right, as always 🙄 I checked this https://stackoverflow.com/questions/2430303/disadvantages-of-scanf#answer-2430978 and it seems that you can take care of any possible edge case input.
30th Oct 2020, 9:39 PM
Davide
Davide - avatar