2014-02-06 4 views
0

Я пытаюсь использовать неподписанные решение «user434507» здесь:Return символ * вместо строки

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

, но вместо этого я хочу, чтобы вернуть символ * и не принимает в строке.

Я играл с ним некоторое время, и это то, что у меня есть, но оно просто ничего не возвращает/мусор. Мое ограниченное знание C и указателя не помогает мне. Я думаю, что я использую 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'th. –

+0

Я добавил 'c + = size-1;' перед моим циклом while, и это не помогает. – ParoX

Смежные вопросы