strtok не является реентерабельным и переходит на пустые токены.sscanf будет работать и может определить для вас числовой или строковый столбец.
#include <stdio.h>
typedef struct {
char op[20];
union {int arg1num;char arg1str[20];} arg1;
char arg2[20],arg3[20];
} Value;
main()
{
Value v;
char withNumber[]="SMUL 9 A B ";
char withoutNumber[]="SMUL \"scalar\" \"matrix-1\" \"matrix-2\" ";
if( 4==sscanf(withNumber,"%[^ ]%d %[^ ] %[^ ]",v.op,&v.arg1.arg1num,v.arg2,v.arg3) )
printf("wN:%s %d %s %s\n",v.op,v.arg1.arg1num,v.arg2,v.arg3);
if( 4==sscanf(withoutNumber,"%[^ ] %[^ 0-9] %[^ ] %[^ ]",v.op,v.arg1.arg1str,v.arg2,v.arg3) )
printf("woN:%s %s %s %s\n",v.op,v.arg1.arg1str,v.arg2,v.arg3);
if( 4==sscanf(withoutNumber,"%[^ ]%d %[^ ] %[^ ]",v.op,&v.arg1.arg1num,v.arg2,v.arg3) )
printf("wN:%s %d %s %s\n",v.op,v.arg1.arg1num,v.arg2,v.arg3);
if( 4==sscanf(withNumber,"%[^ ] %[^ 0-9] %[^ ] %[^ ]",v.op,v.arg1.arg1str,v.arg2,v.arg3) )
printf("woN:%s %s %s %s\n",v.op,v.arg1.arg1str,v.arg2,v.arg3);
return 0;
}