2014-02-06 185 views
0

我想在這裏使用「user434507」的簽名解決方案:返回的char *而不是字符串

C++ performance challenge: integer to std::string conversion

,而是我希望它返回一個char *而在字符串不能接受。

我一直在玩它一段時間,這是我得到的,但它只是沒有返回任何東西/垃圾 - 我有限的C和指針知識不幫助我。我想我正在使用malloc,但是在他的原始代碼中,好像他使用了一個內部char *,並且只是更改了字符串的元素並返回了字符串。我想如果我通過的malloc分配,將有同樣的效果:

char * itostr(unsigned val) 
{ 

    const char digit_pairs[201] = { 
     "00010203040506070809" 
     "10111213141516171819" 
     "20212223242526272829" 
     "30313233343536373839" 
     "40414243444546474849" 
     "50515253545556575859" 
     "60616263646566676869" 
     "70717273747576777879" 
     "80818283848586878889" 
     "90919293949596979899" 
    }; 

    int size; 
    if(val>=10000) { 
     if(val>=10000000) { 
      if(val>=1000000000) { 
       size=10; 
      } else if(val>=100000000) { 
       size=9; 
      } else { 
       size=8; 
      } 
     } else { 
      if(val>=1000000) { 
       size=7; 
      } else if(val>=100000) { 
       size=6; 
      } else { 
       size=5; 
      } 
     } 
    } else { 
     if(val>=100) { 
      if(val>=1000) { 
       size=4; 
      } else { 
       size=3; 
      } 
     } else { 
      if(val>=10) { 
       size=2; 
      } else { 
       size=1; 
      } 
     } 
    } 

    char * c = (char *)malloc(size + 1); 
    c[size] = '\0'; 

    //char* c = &s[size-1]; 
    while(val>=100) 
    { 
     int pos = val % 100; 
     val /= 100; 
     *(short*)(c-1)=*(short*)(digit_pairs+2*pos); 
     c-=2; 
    } 
    while(val>0) 
    { 
     *c--='0' + (val % 10); 
     val /= 10; 
    } 


    return c; 
} 

回答

0
c += size-1; 

你只是第一while循環之前需要此行。兩個循環從右向左寫入數字。需要這樣才能在字符串的右端開始寫入。

+0

該行不在其重載的無符號函數中。但我確實在他的簽名中看到了它。 – ParoX

+0

'char * c =&s [size-1];'在未簽名的版本中做同樣的事情。 'c'開始指向'size-1'數組索引。 –

+0

我在我的while循環之前加了'c + = size-1;'並沒有幫助。 – ParoX

相關問題