+ 6

Code review: Secret message

The following code works, posting it here to see if it can be optimized in any form, speed, possible bugs, etc. Thank you. #include <stdio.h> #include <ctype.h> #define MAX_LEN 4096 int main() { char msg[MAX_LEN], *ptr = msg; fgets(msg, MAX_LEN, stdin); while(*ptr++ = isalpha(*ptr) ? 'z' - tolower(*ptr) + 'a': *ptr) ; fputs(msg,stdout); return 0; }

13th Oct 2022, 1:22 PM
Tina
Tina - avatar
4 Answers
+ 5
If the input text is > MAX_LEN your program fails, but obviously it's not necessary to fix that for the code coach challenge. :) I would prefer a more readable version, like `while(*ptr){ ...; ptr++; }`, but going for shortest code possible is like another challenge on top of the challenge so I'd say you passed :p (Though I suppose you could calculate 'z' + 'a' and replace the two constants with a single number!) Good job!
13th Oct 2022, 1:53 PM
Schindlabua
Schindlabua - avatar
+ 4
Thank you so much Schindlabua in regards to length, you either have to set a value or do it in chunks until EOF. but really nice suggestions! here's the modified version: while(*ptr){ if(isalpha(*ptr)) *ptr = 219 - tolower(*ptr); ptr++; } I also noticed that there was an unnecessary assignment in previous version due to ternary operator in case that the character wasn't alphabet. Thank you again.
13th Oct 2022, 2:19 PM
Tina
Tina - avatar
+ 4
Tina the conversion to lowercase could be made faster, though at the expense of readability. The tolower() function must check whether the character is alphabetic before converting. At this point you already determined that it is alphabetic, so all you need to do is set the bit that makes it lowercase. *ptr = 219 - (*ptr|32);
13th Oct 2022, 2:40 PM
Brian
Brian - avatar
+ 3
pretty amazing Brian ! I guess that would highly improve the speed. Getting rid of calling a function in a loop. Thank you so much for pointing out that!
13th Oct 2022, 3:07 PM
Tina
Tina - avatar