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
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
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
Para o guião 1, basta isto :