I tried making as short as possible for fun and I had this:
for (short x = 0; x != 42; scanf("%hd", &x), (x != 42)&& printf("%hd\n", x));
return 0;
But initially I had this:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <limits.h>
#define ERROR_RET_NULL(x) fprintf(stderr, "ERROR: %s returned NULL in file '%s' at line: %i.", x, __FILE__, (__LINE__ - 2))
int
main(void)
{
while (true)
{
short temp = 0;
char userInputString[5];
char *endPtr;
if (fgets(userInputString, 5, stdin) == NULL)
{
ERROR_RET_NULL("fgets");
exit(EXIT_FAILURE);
}
else
{
char *checkPtr = strchr(userInputString, '\n');
if (checkPtr) *checkPtr = '\0';
long numberToCastToShort = strtol(userInputString, &endPtr, 10);
if (numberToCastToShort > SHRT_MAX || numberToCastToShort < SHRT_MIN)
{
/* Given the size restriction on the string this is basically deadcode */
fprintf(stderr, "ERROR: number too big");
exit(EXIT_FAILURE);
}
else if (numberToCastToShort == 42) break;
else temp = (short) numberToCastToShort;
}
printf("%d\n", temp);
}
return 0;
}