とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Cパズルプログラミング-再帰編(5)

→続 Karetta|Cパズルプログラミング-再帰編|四則演算
電卓作るんだよな…。

Karetta|Cパズルプログラミング-再帰編|トークンがやっと動き出す

expr3.c

Karetta|Cパズルプログラミング-再帰編|expr3.c
GetTokenが変態的なコードになったがあまり気にしないことにする。
ポインタアレルギーの方は見てはいけない。蕁麻疹が出て,自分の方が診られる羽目になるかもしれないから。
do-whileでブロックを使わないのも,人によっては驚くかもしれない。
const char**s; という宣言があるとして *(*s)++; という式がどのように評価されるのかすぐに理解できるようであれば,プログラム言語Cのちょっと深いところが分かる人だ。でも普段からこんなコードを書いていれば,プログラム言語Cを全然理解していない人だ。
っつうか,再帰でてこないぞ。

#include<ctype.h>
char*GetToken(const char**s,char*t){
char*p=t;
for(;isspace(**s);++*s);
if(**s=='\n'||**s==0){*t=0;return 0;}
if(isdigit(**s))do*p++=*(*s)++;while(isdigit(**s));
else*p++=*(*s)++;
*p=0;
return t;
}
#include<stdlib.h>
#include<stdio.h>
int Evaluate(const char*s){
char*t=malloc(1024);
int r=0;
if(t)for(;GetToken(&s,t);)printf("\ttoken:%s\n",t);
free(t);
return r;
}
int main(void){
char*b=malloc(1024);
if(b)for(;printf("expr:"),fgets(b,1024,stdin);Evaluate(b))printf("\t%s\n",b);
free(b);
}