Читаю Липпмана. Он говорит, что специально для операций со строками существует тип данных string::size_type, и что именно его нужно использовать, если предполагается хранить длину строки. Например, так:
string str("Hello world");
string::size_type len = str.size();
cout << len << endl;
В результате будет 11.
Он говорит, что тип int здесь может быть опасным, т.к. допускает отрицательные значения, чего не должно быть с длинами строк. Тип unsigned вроде бы должен подходить, но для этого то и сделан тип size_type. Короче, говорит, нужно использовать только его.
Пробую программку реверсирования введенной строки:
#include <iostream>
#include <string>
using std::string;
using std::cin; using std::cout; using std::endl;
int main()
{
string str;
cout << "Enter a string to reverse" << endl;
cin >> str;
for(string::size_type i = str.size() - 1; i >= 0; i--)
cout << str[i];
cout << endl;
return 0;
}
Строку реверсирует, а потом выводит какой-то мусор. В конце пишет, что ошибка сегментации. Если для переменной i использовать тип unsigned, то ни мусора, ни результата, хотя ошибка сегментации также присутствует. А если использовать int, то все работает нормально.
В чем здесь дело?