Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
612 views
in Technique[技术] by (71.8m points)

c - How to use sscanf correctly and safely

First of all, other questions about usage of sscanf do not answer my question because the common answer is to not use sscanf at all and use fgets or getch instead, which is impossible in my case.

The problem is my C professor wants me to use scanf in a program. It's a requirement. However the program also must handle all the incorrect input.

The program must read an array of integers. It doesn't matter in what format the integers for the array are supplied. To make the task easier, the program might first read the size of the array and then the integers each in a new line.

The program must handle the inputs like these (and report errors appropriately):

  1. 999999999999999...9 (numbers larger than integer)
  2. 12a3 (don't read this as an integer 12)
  3. a...z (strings)
  4. 11 aa 22 33 all in one line (this might be handled by discarding everything after 11)
  5. inputs larger than the input array

There might be more incorrect cases, these are the only few I could think of.

If the erroneous input is supplied, the program must ask the user to input again until the correct input is given, but the previous correct input must be kept (only incorrect input must be cleared from the input stream).

Everything must conform to C99 standard.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The scanf family of function cannot be used safely, especially when dealing with integers. The first case you mentioned is particularly troublesome. The standard says this:

If this object does not have an appropriate type, or if the result of the conversion cannot be represented in the object, the behavior is unde?ned.

Plain and simple. You might think of %5d tricks and such but you'll find they're not reliable. Or maybe someone will think of errno. The scanf functions aren't required to set errno.

Follow this fun little page: they end up ditching scanf altogether.


So go back to your C professor and ask them: how exactly does C99 mandate that sscanf will report errors ?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...