Skip to content

Instantly share code, notes, and snippets.

@PanNyaa
Created April 14, 2014 16:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PanNyaa/10663936 to your computer and use it in GitHub Desktop.
Save PanNyaa/10663936 to your computer and use it in GitHub Desktop.
strcalc.c の一部分だけ。 +/ *- -/ /- を特殊演算子扱いで計算して、答で置換する処理 をするような部分。 たぶんこうなるかなー…っと思うん
// "+/","*-","-/","/-" は別途計算しなければいけないので特殊演算子扱いで先に計算する
while( (p=strstrs(str,"+/","*-","-/","/-"))!=NULL ){
char *now_p,*p_start,*p_end;
now_p = strstrsback(str,p,"+","-","*","/"); //演算子を後方検索で探す
if(now_p==NULL){ //NULLだったら=先頭の項だったら
n = ptrdiff((p_start=str),p-1); //strの先頭から特殊演算子の手前までポインタ間diff
if(n > 10){
e += n-10;n=10; //項が10桁を超えていたらe+N表示のためにeを差分だけ加算
}
strncpy(before_term_str,str,n); //前の項を文字列先頭から取得
}else{ //見つかったら
n = ptrdiff((p_start=now_p+1),p-1); //演算子位置+1から特殊演算子の手前までポインタ間diff
if(n > 10){
e += n-10;n=10; //項が10桁を超えていたらe+N表示のためにeを差分だけ加算
}
strncpy(before_term_str,now_p+1,n); //前の項を前演算子+1の位置から取得
}
now_p = strstrs(p+2,"+","-","*","/"); //演算子を特殊演算子+2の位置から探す
if(now_p==NULL){ //NULLだったら=最後方の項だったら
n = ptrdiff(p+2,(p_end=str+strlen(str)-1)); //特殊演算子+2の位置から文字列終端-1の位置までポインタ間diff
if(n > 10){
e += n-10;n=10;
}
strncpy(after_term_str,p+2,n); //後の項を文字列終端まで取得
}else{ //見つかったら
n = ptrdiff(p+2,(p_end=now_p-1)); //特殊演算子+2の位置から演算子-1の位置までポインタ間diff
if(n > 10){
e += n-10;n=10;
}
strncpy(after_term_str,p+2,n); //後の項を次演算子-1の位置から取得
}
before_term = atoi(before_term_str); //特殊演算子手前の項を数値に変換
after_term = atoi(after_term_str); //特殊演算子後方の項を数値に変換
if(p=='+'){answer_term = before_term + (1 / after_term );} // +/
else if(p=='*'){answer_term = before_term * (-1 * after_term );} // *-
else if(p=='-'){answer_term = before_term - (1 / after_term );} // -/
else if(p=='/'){answer_term = before_term / (-1 * after_term );} // /-
// 1+1+1+1 →1+1が2に→ 1+1+2+1 → 詰める →1+1+2
sprintf(str_temp,"%d",answer_term); //アンサー値を文字列に変換
strncpy(p_start,str_temp,strlen(str_temp)); //式の部分に答えを上書き(式の文字列はまだ余っている)
memmove(p_start+strlen(str_temp),p_end+1,strlen(p_end+1)); //余った式を詰める
str+strlen(str)-ptrdiff(p_start,p_end)+strlen(str_temp) = '\0'; //詰め終わっても \0 の位置がそのままなので \0 もずらす
}
@PanNyaa
Copy link
Author

PanNyaa commented Apr 14, 2014

自作関数がちらほらありますが関数名とか引数とかから察して下しあ()

@PanNyaa
Copy link
Author

PanNyaa commented Apr 14, 2014

(まだ一回も走らせてない部分なので動作未検証です…… strstrsbackが未実装だなんて口が裂けても言えない(しろめ)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment