Here's my solution:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
typedef struct tagParam
{
int coeff;
int subscript;
} PARAM, *LPPARAM;
int main(int argc, char* argv[])
{
static char eq[256] = "X2+X1+3X3";
LPPARAM lpParams = new PARAM[100];
memset((void*)lpParams, 0x00, sizeof(PARAM) * 100);
int n = 0;
for (int i = 0; eq[i] != '\0'; i++)
{
if (isdigit(eq[i]) && isdigit(eq[i + 2]) && eq[i + 1] == 'X')
{
lpParams[n].coeff = eq[i] - '0';
lpParams[n++].subscript = eq[i + 2] - '0';
i += 3;
}
else if (eq[i] == 'X' && isdigit(eq[i + 1]))
{
lpParams[n++].subscript = eq[i + 1] - '0';
i += 2;
}
}
for (int i = 0; lpParams[i].subscript != 0; i++)
{
int min = i;
for (int j = i + 1; lpParams[j].subscript != 0; j++)
min = (lpParams[j].subscript < lpParams[min].subscript) ? j : min;
PARAM temp = lpParams[i];
lpParams[i] = lpParams[min];
lpParams[min] = temp;
}
static char output[256] = "\0";
for (int i = 0; lpParams[i].subscript != 0; i++)
if (lpParams[i].subscript != 0 && lpParams[i].coeff == 0)
sprintf_s(output, 256, "%sX%d+", output, lpParams[i].subscript);
else if (lpParams[i].subscript != 0 && lpParams[i].coeff != 0)
sprintf_s(output, 256, "%s%dX%d+", output, lpParams[i].coeff, lpParams[i].subscript);
output[strlen(output) - 1] = '\0';
printf("input = %s\noutput = %s\n", eq, output);
_getch();
return 0;
}