MATLAB: Do the FSCANF and SSCANF functions not work as expected with the %i and %d format specifiers

bugdformatfscanfiMATLABspecifierssscanf

There appears to be problems using the SSCANF function and the FSCANF function with the %d and %i format specifiers. The following output at the MATLAB command prompt illustrates this problem:
sscanf('0008','%4d') % works as expected
ans =
8
sscanf('2.34','%4d') %does not work as expected
ans =
''
sscanf('0008','%4i') %does no work as expected
ans =
''
sscanf('8','%4i') %this works as expected
ans =
8

Best Answer

The above behavior of the FSCANF and SSCANF functions are the expected behavior. Note that the two cases that seemingly do not work as expected actually return "silent" errors. You can view these errors if you call the SSCANF function with 4 output arguments and look at the ERRMSG output.
[A,COUNT,ERRMSG,NEXTINDEX] = SSCANF(S,FORMAT,SIZE)
The problem in the first case occurs because it is not acceptable to pass digits containing a decimal point as input to be scanned by %d (which takes a base10 integer).
[a,count,errmsg,nextidx]=sscanf('2.34','%3d') % decimal point
a = ''
count = 0
errmsg = Matching failure in format.
nextidx = 1
The second problem occurs because the %i refers to a base10 integer by default, unless the numeric value begins with 0x or 0X (zero x), in which case it is a base16 (hex) integer and if it begins with a 0 (zero) then it is a base8 (octal) integer.
[a,count,errmsg,nextidx]=sscanf('08','%4i') % octal digits are 0-7.
a = ''
count = 0
errmsg = Matching failure in format.
nextidx = 1
The above code caused an error because 8 is not a valid octal digit.