0

This is the problem:
Your program is to use the brute-force approach in order to find the Answer to Life, the Universe, and Everything. More precisely... rewrite small numbers from input to output. Stop processing input after reading in the number 42. All numbers at input are integers of one or two digits.

Input:
1
2
88
42
99

My first code doesn't work:

while( scanf("%d\n", &n) != 42 ){
    printf("%d\n",n);
}

second code, with for loop, works but there is a test case where there is no number 42 so it returns TLE, how do I check for end of input?

for(i=1;i>0;i++){
    scanf("%d\n",&n);
    if(n!=42 ){       /* end of input??? */
        printf("%d\n",n);
    }
    else {
        break;
    }
}

And why doesn't while loop work like it should?

egur
  • 7,830
  • 2
  • 27
  • 47
user31415
  • 19
  • 1
  • 6

2 Answers2

2

scanf returns the number of characters scanned, not the result.

So, write while loop as follows:

scanf("%d", &n);
while( n != 42 ){
    printf("%d\n",n);
    scanf("%d", &n);
}
doptimusprime
  • 9,115
  • 6
  • 52
  • 90
1

Always good to avoid magic numbers. Define a constant.

Check the result of scanf() (@Joachim Pileborg)

To check if the input is valid , test if scanf() result is 1 (1 format specifier correctly scanned).

To check for end of input, test if scanf() result is EOF.

while loop failure is well explained by @dbasic. Roughly, scanf() reports the number of fields scanned, not the value scanned.

There is a lot to scanf(). If up to it, read the scanf() section of the C spec. Where do I find the current C or C++ standard documents?

const int Answer_to_Life_the_Universe_and_Everything = 42;
int n;
int cnt;
// Use 2d to limit to 2 digits
while ((cnt = scanf("%2d\n",&n)) == 1) {  
  if(n != Answer_to_Life_the_Universe_and_Everything) {   /* end of input? */
    printf("%d\n",n);
  }
  else {
    break;
  }
}
if (cnt != EOF) Handle_UnexpectedInput();  // example someone type in "junk"
Community
  • 1
  • 1
chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256