2015-06-10 48 views
0

我剛剛意識到我編寫的程序存在一個主要缺陷。這是一個象徵性地區分數學函數的程序,例如"x^2+5" - >"2*x",以及所涉及的主功能類似如何在可能的遞歸過程中設置緩衝區?

char * deriveFromTree (node * rt) 
{ 
    char * dfdx = malloc(100*sizeof(char)); // buffer 
    if (rt->op) // if rt is of the form rt = gx op hx 
    { 
     char * dgdx = deriveFromTree(rt->gx); // g'(x) 
     char * dhdx = deriveFromTree(rt->hx); // h'(x) 
     char thisop = *rt->op; 
     if (thisop == '+' || thisop == '-') 
     { 
      // ADDITION/SUBTRACTION RULE: 
      // dfdx = dgdx + thisop + dhdx 
      dfdx = strcat(dfdx, dgdx); 
      dfdx = strcat(dfdx, charToString(thisop)); 
      dfdx = strcat(dfdx, dhdx); 

     } 

開始起飛的問題,因爲你可能已經看到,是的deriveFromTree結果符合長度100的緩衝區,但結果也可以由其他幾個結果,這是不行的。另一種解決方案是擺脫緩衝區和設置dfdx是它需要的精確長度:

char * deriveFromTree (node * rt) 
{ 
    char * dfdx; 
    if (rt->op) // if rt is of the form rt = gx op hx 
    { 
     char * dgdx = deriveFromTree(rt->gx); // g'(x) 
     char * dhdx = deriveFromTree(rt->hx); // h'(x) 
     char thisop = *rt->op; 
     if (thisop == '+' || thisop == '-') 
     { 
      // ADDITION/SUBTRACTION RULE: 
      // dfdx = dgdx + thisop + dhdx 
      dfdx = malloc(strlen(dgdx) + strlen(dhdx) + 2); 
      dfdx = strcat(dfdx, dgdx); 
      dfdx = strcat(dfdx, charToString(thisop)); 
      dfdx = strcat(dfdx, dhdx); 

     } 

但是,這是因爲電話strlen(dgdx)strlen(dhdx)迭代通過串dgdxdhdx然後低效他們在strcat調用中再次迭代。

這個問題的最佳解決方案是什麼?

+0

請避免標記C++,除非您的代碼是專門用C++編寫的。這顯然是純粹的C代碼。 – CoryKramer

+1

使用'std :: string'和'+ =' –

+0

定義一個數據結構 - 一種抽象 - 表示表達式並停止使用字符串。 – molbdnilo

回答

1

由於您已將問題標記爲C++,因此我會建議chuck char *並使用std :: string。 該代碼看起來像這樣:

string deriveFromTree (node * rt) 
{ 
    string dfdx // buffer 
    if (rt->op) // if rt is of the form rt = gx op hx 
    { 
     string dgdx = deriveFromTree(rt->gx); // g'(x) 
     string dhdx = deriveFromTree(rt->hx); // h'(x) 
     char thisop = *rt->op; 
     if (thisop == '+' || thisop == '-') 
     { 
      // ADDITION/SUBTRACTION RULE: 
      // dfdx = dgdx + thisop + dhdx 
      dfdx = dfdx + dgdx + thisop + dhdx; //strcat(dfdx, dgdx); 
     } 
+0

我將它標記爲C++,因爲它是有效的C++。 –

+0

@MicrosoftOrangeBadge例如'char * dfdx = malloc(...'是完全有效的C,但在C++中無效。 – Lundin

相關問題