scanf()
returns the number of items assigned. Maybe you can use that info ...
char *data = "1, 2,,, 5, 6";
int a[6];
int assigned = sscanf(data, "%d,%d,%d,%d,%d,%d", a, a+1, a+2, a+3, a+4, a+5);
if (assigned < 6) {
char fmt[18];
switch (assigned) {
default: assert(0 && "this did not happen"); break;
case 0: fmt = ",%d,%d,%d,%d,%d"; break;
case 1: fmt = "%d,,%d,%d,%d,%d"; break;
case 2: fmt = "%d,%d,,%d,%d,%d"; break;
case 3: fmt = "%d,%d,%d,,%d,%d"; break;
case 4: fmt = "%d,%d,%d,%d,,%d"; break;
case 5: fmt = "%d,%d,%d,%d,%d,"; break;
}
sscanf(data, fmt, a+(assigned<=0), a+1+(assigned<=1), a+2+(assigned<=2),
a+3+(assigned<=3), a+4+(assigned<=4));
}
Ugh! And that's only for 1 missing value
As has been pointed out by other answers, you're much better off parsing the string in the 'usual' way: fgets()
and strtok()
.