std::string - length() и strlen()
От: deadka  
Дата: 20.04.10 09:09
Оценка: :)))
Доброго времени суток, Господа Форумчане!

Подскажите кто знает, пожалуйста, следующий момент: нужно ли выделять в std::string один байт на конец строки '\0'?
В обычных строках (char[]) ведь нужно было бы на строку "123" 4 байта — по одному на '1', '2' и '3' и один на '\0'.
В примере, приведенном ниже видно, что если выделить на один байт больше, то строки неправильно сравниваются, хотя strcmp возвращает ожидаемый результат. Судя по результату правильно было бы выделять 3 байта на такую строку, но что тогда будет с завершающим нулем?


#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>

int main(void)
{
    std::string S1(3,' ');
    sprintf(&S1[0],"%s","123");
    
    if (S1=="123")
    {
    std::cout << "Equally" << std::endl;
    }
    else
    {
    std::cout << "Not equally" << std::endl;
    }
    if (!strcmp(S1.c_str(),"123"))
    {
    std::cout << "Equally" << std::endl;
    }
    else
    {
    std::cout << "Not equally" << std::endl;
    }
    
    std::string S2(4,' ');
    sprintf(&S2[0],"%s","123");
    
    if (S2=="123")
    {
    std::cout << "Equally" << std::endl;
    }
    else
    {
    std::cout << "Not equally" << std::endl;
    }
    if (!strcmp(S2.c_str(),"123"))
    {
    std::cout << "Equally" << std::endl;
    }
    else
    {
    std::cout << "Not equally" << std::endl;
    }
    return 0;
}


Результат (компилятор — g++ 4.3.2):


Equally
Equally
Not equally
Equally
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.