?
Naja, selbst wenn das ginge, wäre es mit dem Format-String ja nicht getan - woher wüsstest du, welches %d sich auf welchen Integer bezieht?
Ansonsten könnte man das aber beispielsweise so machen:
void *scanf_parameter[5];
scanf_parameter[0] = &i1;
scanf_parameter[1] = &i2;
scanf_parameter[2] = &d1;
scanf_parameter[3] = &d2;
scanf_parameter[4] = s;
sscanf(instr, fmt_string_gut_geprueft_mehrere_ausrufungszeichen,
scanf_parameter[0],
scanf_parameter[1],
scanf_parameter[2],
scanf_parameter[3],
scanf_parameter[4]);
Wobei du natürlich höllisch aufpassen musst, dass der Benutzer dir einen Format-String andreht, der auch auf die Parameter passt - das ganze Unterfangen ist so höchst gefährlich. Wahrscheinlich tätest du besser daran, den Benutzer keine Format-Strings hereinreichen zu lassen, sondern speziell definierte und in der Funktionalität auf das erlaubte eingeschränkte Spezifikationsstrings, mit denen du die Tokens jeweils einzeln parsen kannst.
Das muss nichts kompliziertes sein; ein einfacher String, in dem jedes einzelne Zeichen einen Wert bezeichnet, dann kannst du in einer Schleife mit switch, sscanf und dem %n-Spezifikator durch den Eingabestring durchgehen.