2 3 *
5

5 2 3 *
56

5 2 3 * + 
11

5 2 %
1

5 2 /
2

2 4 # // 2^4
16

3 4 & // 11 100
0

3 4 
7

3 4 ^
7

7 2 ^
5

2 3 ~
2-4

2 3 # 15 ^
7

2 3 # 15 ^ ~ 4
-84

32 2 3 # 15 ^ ~ 4
32-84

3 2 # 4 2 # +
25

3 3 * 4 4 * +
25

Passo 1

No ficheiro main :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "parser.h"

int main () {

	char line[10240];

	assert( fgets(line, 10240, stdln) != NULL);
	assert( line [strlen(line) - 1] == '\\n');   // Se conseguir encontrar o \\n no final quer dizer que leu a linha toda

	parse(line);
	return 0;
}

Agora, no ficheiro chamado "parser.h" :

void parse (char *line);

E no ficheiro chamado "parser.c" :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "parser.h"

void parse (char *line) {

	char *delims = " \\t\\n"; // Conjundo dos delimitidaores

	for(char *token = strtok(line, delims); token != NULL; token = strtok(NULL, delims)) {
		printf("%s\\n", token);
	}
}

Assim teremos isto :

q w kwejlkew w rt 122312c 12 ew

q
w
kwejlkew 
w
rt
122312c 
12 ew

Passo 2

O que separamos é um inteiro ou um real?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "parser.h"

void parse (char *line) {

	char *delims = " \\t\\n"; // Conjundo dos delimitidaores

	for(char *token = strtok(line, delims); token != NULL; token = strtok(NULL, delims)) {
		char *sobra;
		long val_i = strtol (token, &sobra, 10);
		if (strlen(sobra) == 0) {
					printf("INT: %ld\\n", val_i); // se sobra tiver vazio quer dizer que é um inteiro
		} else {
						double val_d = strtod (token, &sobra);
						if (strlen(sobra) == 0) {
									printf ("DOUBLE: %lf\\n", val_d);
						} else 
										printf("%s\\n", token);
		}
	}
}

Isto vai dar :

Antes :
qw 12 ee -23 rew 2.34 re

qw 0 'qw'
12 12 ''
ee 0 'ee'
-23 -23 ''
rew 0 'rew'
2.34 2 '.34'
re 0 're'

Depois :
qw 12 ee -23 rew 2.34 re

qw
INT: 12
ee
INT: -23
rew
DOUBLE: 2.3400000
re

Passo 3

Para o guião 1, basta isto :