Created
April 14, 2014 16:40
-
-
Save PanNyaa/10663936 to your computer and use it in GitHub Desktop.
strcalc.c の一部分だけ。 +/ *- -/ /- を特殊演算子扱いで計算して、答で置換する処理 をするような部分。 たぶんこうなるかなー…っと思うん
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// "+/","*-","-/","/-" は別途計算しなければいけないので特殊演算子扱いで先に計算する | |
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 もずらす | |
} | |
(まだ一回も走らせてない部分なので動作未検証です…… strstrsbackが未実装だなんて口が裂けても言えない(しろめ)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
自作関数がちらほらありますが関数名とか引数とかから察して下しあ()