Question 12.20

Why does everyone say not to use scanf? What should I use instead?


scanf has a number of problems--see questions 12.17, 12.18, and 12.19. Also, its %s format has the same problem that gets() has (see question 12.23)--it's hard to guarantee that the receiving buffer won't overflow.

More generally, scanf is designed for relatively structured, formatted input (its name is in fact derived from ``scan formatted''). If you pay attention, it will tell you whether it succeeded or failed, but it can tell you only approximately where it failed, and not at all how or why. It's nearly impossible to do decent error recovery with scanf; usually it's far easier to read entire lines (with fgets or the like), then interpret them, either using sscanf or some other techniques. (Routines like strtol, strtok, and atoi are often useful; see also question 13.6.) If you do use sscanf, don't forget to check the return value to make sure that the expected number of items were found.

References: K&R2 Sec. 7.4 p. 159


Read sequentially: prev next up top


This page by Steve Summit // Copyright 1995 // mail feedback