nowcoder本当に欺瞞

点ああが何であるかに関与する本当に単純な単純な算術計算コード、

私の欺瞞実装は、strrchrので、いくつかのバグにつながる、何のオートコンプリート、自分自身を達成するために、再びコード、無通勤時間以上の120行の結果をATOIませんが、時間が、醜いコードタイトで、機能設計にも無理があります:

私はない、とそれの結果は、バグの半分を占めている場合、他の場合、これは基本的に、私がもしあればそのコードは一口に見えるので、他にこのあまり好きではない場合に使用しました。

する#include <stdio.hに> 
する#include <STDLIB.H> 
の#include <string.hの> 

typedefを列挙
{ 
    SYM_ADD = 0、
    SYM_DEL、
    SYM_MUL、
    SYM_DIV、
    SYM_INVALID 
} ENUM_Calc_SYM; 
CHAR * findChr(INPUT CONSTチャー*、チャーCHR)
{ 
    のconstのchar *のPOS = INPUT; 
    IF(INPUT == NULL)
        戻りNULL; 
    しばらく(* POS = '\ 0'!)
    { 
        IF(POS * == CHR)
		{ IF(CHR == ' - ')//機能が汚染関数であり、これは、取り出すべき 
			{ 
				IF((POSを!=入力)&&(*(-pos 1)> = '0')&&(*(-pos。1)<=」9' ) )
					リターン(のchar *)POS。
			} 
			他の
			 
			{
				リターン(のchar *)POS。
			} 
		} 
        POS ++。
    } 
    NULLを返します。
} 

int型str2int(CONSTのchar *入力、INT * A)
{ 
    int型validFlag = 0。
    INTフラグ= 1。
    int型の合計= 0; 
    CONSTのchar *のPOS =入力。
    IF(NULL ==入力|| NULL == A)
        リターン-1。
    一方、(!* POS = '\ 0')
    { 
        IF(* POS == ' - ')
            フラグ= -1。
        そうであれば(* POS> = '0' && * POS <= '9')
        { 
            validFlag = 1。
            合計=合計* 10台の+ * POS - '0'; 
        }他
        { 
            破ります。
		POS ++; 
    }
    (validFlag == 0)の場合は
        -1を返します。
    合計=フラグ*合計。
    * =合計。
    0を返します。
} 
ボイドparseCmd(CHAR *入力、INT *、int型* Bを、int型*フラグ)
{ 
    チャー*のPOS = NULL; 
    (NULL ==入力)場合は
        リターン。
    (NULLが|| NULL == NULL || B ==フラグ==)場合
        リターン; 
    *フラグ= SYM_INVALID。
    (!(POS = findChr(入力、 '+'))= NULL)であれば
    { 
        *フラグ= SYM_ADD。
    } 
    そうであれば((POS = findChr(入力、 ' - '))= NULL!)
    { 
        *フラグ= SYM_DEL。
    } 
    そうであれば((POS = findChr(入力、 '*'))!= NULL)
    {
        *フラグ= SYM_MUL。
    } 
    そうであれば((POS = findChr(入力、 '/'))= NULL!)
    { 
        *フラグ= SYM_DIV。
    } 
    IF(NULL == POS)
       のリターン; 
       
    * POS = '\ 0'; 
    POS ++; 
    (!= 0 str2int(入力A)|| 0 = str2int(POS、B))であれば
    { 
       *フラグ= SYM_INVALID。
    } 
    を返します。
} 
ボイドメイン()
{ 
    文字入力[100] = {0}。
    、B int型。
    int型のフラグ。
    (scanf関数( "%sの"入力)== 1)一方
    { 
        フラグ= SYM_INVALID。
        parseCmd(入力、および、&​​B、&フラグ)。
        memsetの(入力、0、はsizeof(入力))。
        もし(フラグ== SYM_INVALID)
            ブレーク。
        スイッチ(フラグ)
        { 
            ケースSYM_ADD:
                のprintf( "%d個の\ n"、A + B)。
                ブレーク; 
            ケースSYM_DEL:
                のprintf( "%d個の\ n"、AB)。
                ブレーク; 
            ケースSYM_MUL:
                のprintf( "%d個の\ n"、*のB)。
                ブレーク; 
            ケースSYM_DIV:
                もし(B == 0)
                    ブレーク。
                printf( "%Fを\ n"、(フロート)A / B)。
                ブレーク; 
            デフォルト:
                休憩; 
        } 
    } 
}

  ただ、テストをだますために、コードの20行が十分にあります。

する#include <stdio.hに> 
する#include <STDLIB.H> 
の#include <string.hの> 
ボイドメイン()
{ 
    文字入力[100] = {0}。
    、B int型。
    int型のフラグ。
    一方、(scanf関数( "%s"は、入力)== 1)
    { 
		IF(のsscanf(入力、 "%のD +%のD"、&、&B)== 2)
		{ 
			のprintf( "%d個の\ n"、+ B ); 
		} 
		IF(のsscanf(入力、 "%D-%D"、&、&B)== 2)
		{ 
			のprintf( "%Dを\ n"、AB)。
		} 
		IF(のsscanf(入力、 "%d個の*%dの"、&、&B)== 2)
		{ 
			のprintf( "%Dを\ n"、*のB)。
		} 
		IF(のsscanf(入力、 "%D /%D"、&、&B)== 2)
		{ 
			のprintf(」

  

おすすめ

転載: www.cnblogs.com/green-crosswalk/p/11257263.html