Wednesday, 20 April 2011

scanf() seems to be skipped


i'm building program calculates wether entered value prime number or not. setvalue method:

code:
-(void)setvalue  {      boolean instructionsneeded = no;            printf("\ntype in number check if it's prime.\n");            ( ; ; )      {          if (instructionsneeded == yes)          {              printf("please insert positive integer, smaller 2^63 (%li).\n", 9223372036854775807);          }                    scanf("%lli", &value);                        if (value < 1)          {              printf("oops, value small. ");              instructionsneeded = yes;          }         else if (value > 9223372036854775807)         {              printf("oops, value big. ");             instructionsneeded = yes;         }         else                           break;      }            [self primetester:value];  }
value declared in header file, it's of type long long. when -15 inserted, output expected:

type in number check if it's prime.
-15
oops, value small. please insert positive integer, smaller 2^63 (9223372036854775807).

however, when entering number that's not of type long long, i.e. 0.2, scanf() seems skipped:

type in number check if it's prime.
0.2
oops, value small. please insert positive integer, smaller 2^63 (9223372036854775807).
oops, value small. please insert positive integer, smaller 2^63 (9223372036854775807).
oops, value small. please insert positive integer, smaller 2^63 (9223372036854775807).


etcetera.

i've searched ways check wether value value program can deal (type long long) , wait value entered, found nothing suitable. tried lot, using variable called input of type long double, nothing worked.

also, when enter number higher 2^63, i.e. 100000000000000000000, program doesn't tell it's big:

type in number check if it's prime.
100000000000000000000
no, 9223372036854775807 not prime number, 9223372036854775807 = 7^2 x 73 x 127 x 337 x 92737 x 649657.

appreciated.
 

there 2 problems.

first scanf() eat characters until bumps 1 not digit. in 0.2 case, gobble 0 , stop @ dot. nasty thing dot remain in input buffer, next time round run same dot again, not modify "value" @ all.

there several ways can solve this, 1 first getting whole line of text user , parsing afterwards. also, note scanf() returns number of input items matched (in second , following loops, zero). use check errors too.

second, when parse big number 64 bit signed integer, , user enters won't fit in signed 64 bit integer, how check work..?
 


Forums Macs Mac Programming


  • iPhone
  • Mac OS & System Software
  • iPad
  • Apple Watch
  • Notebooks
  • iTunes
  • Apple ID
  • iCloud
  • Desktop Computers
  • Apple Music
  • Professional Applications
  • iPod
  • iWork
  • Apple TV
  • iLife
  • Wireless

No comments:

Post a Comment