Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: C++: загадочный тип данных string::size_type  (Прочитано 1754 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
C++: загадочный тип данных string::size_type
« : 22 Февраля 2019, 19:44:09 »
Читаю Липпмана. Он говорит, что специально для операций со строками существует тип данных 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, то все работает нормально.
В чем здесь дело?
« Последнее редактирование: 22 Февраля 2019, 20:23:54 от Jack Sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #1 : 22 Февраля 2019, 21:56:01 »
Так, к примеру.
...
 for(string::size_type i = str.size(); i > 0; i--)
    cout << str[i-1];
 ...

i меньше 0 не может быть - беззнаковое целое, и цикл в твоем случае бесконечный.
Извините, я все еще учусь

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #2 : 22 Февраля 2019, 23:07:26 »
C
#include <stdio.h>
#include <stdlib.h>

int main (){
  char *c, *str = malloc (100);
  c = str;
  printf ("Enter a string to reverse\n");
  fgets (str,100,stdin);
  while (*str){
    putchar (*str);
    str++;
   }
  str = c;
  free (str);
 return 0;
}
Wars ~.o

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #3 : 22 Февраля 2019, 23:23:54 »
victor00000, to reverse.
Надо вывести в обратном порядке
1234
4321
Извините, я все еще учусь

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #4 : 22 Февраля 2019, 23:47:01 »
victor00000, to reverse.
Надо вывести в обратном порядке
1234
4321
спасибо, понял. :)

C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (){
  char *c, *str = malloc (100);
  c = str;
  printf ("Enter a string to reverse\n");
  fgets (str,100,stdin);
  str +=  strlen (c);
  str -= 2;
  while (!(str < c)){
    putchar (*str);
    str--;
   }
  puts ("");
  str = c;
  free (str);
 return 0;
}
Wars ~.o

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #5 : 22 Февраля 2019, 23:50:15 »
victor00000, неработает
1234
1234 -> надо 4321
Извините, я все еще учусь

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #6 : 23 Февраля 2019, 00:26:50 »
victor00000, неработает
1234
1234 -> надо 4321
конечно не работает.
Wars ~.o

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #7 : 23 Февраля 2019, 10:01:38 »
Сегодня утром уже сам понял это, когда мыл посуду  :)
Вот здесь интересно обсуждают выбор int vs unsigned int в циклах.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #8 : 23 Февраля 2019, 12:26:45 »
Цитировать
здесь
не работает сайт, честно.
================
int помог русский язык писать и обратно, обычно wchar_t.
C
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>

int main (){
setlocale (LC_ALL,getenv ("LANG"));
int *c,*str = malloc (sizeof(int)*100);
c = str;
printf ("Обратно:\n");
fgetws ((wchar_t*)str,100,stdin);
while (*str) str++;
str -= 2;
while (!(str<c)){
printf ("%lc",*str);
str--;
}
puts ("");
str = c;
free (str);
return 0;
}


Пользователь добавил сообщение 23 Февраля 2019, 13:06:14:
Цитировать
int vs unsigned int
https://forum.ubuntu.ru/index.php?topic=301576.0
« Последнее редактирование: 23 Февраля 2019, 13:06:14 от victor00000 »
Wars ~.o

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #9 : 23 Февраля 2019, 19:53:59 »
Вот здесь интересно обсуждают выбор int vs unsigned int в циклах.
"О сколько нам открытий чудных..." будет при работе со строками, там и кодировки разные, и концы строк разные в разных ОС...
Извините, я все еще учусь

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: C++: загадочный тип данных string::size_type
« Ответ #10 : 23 Февраля 2019, 23:48:26 »
Ну, не знаю. Мне кажется, что эта проблема (разные концовки строк в разных ОС) на сей день уже должна быть давно решена на уровне либов. Я ведь о Липпмане говорил, а не о K&R.
Linux is only free if your time has no value (c) Jamie Zawinski

 

Страница сгенерирована за 0.041 секунд. Запросов: 25.