Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
danrunet
Сообщений: n/a
#1

Непонятен пример из Лафоре - C++

08.01.2013, 20:01. Просмотров 373. Ответов 6
Метки нет (Все метки)

В 7й Главе
Никак не могу понять как реализован выход из цикла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
   string s1("Quick! Send for Count Graystone.");
   string s2("Lord");
   string s3("Don't ");
 
   s1.erase(0, 7);
   s1.replace(9, 5, s2);
   s1.replace(0, 1, "s");
   s1.insert(0, s3);
   s1.erase(s1.size() -1, 1);
   s1.append(3, '!');
 
   int x = s1.find(' ');
   while(x < s1.size()) // Не понятен смысл этого выражения. Возможно так ( x != -1 ). Или я чтото упустил?
   {
      s1.replace(x, 1, "/");
      x = s1.find(' ');
   } 
   cout << "s1: " << s1 << endl;
   return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
08.01.2013, 21:04     Непонятен пример из Лафоре #2
x = s1::find(' ') - выполняет поиск пробела в строке s1. Если пробел найден в x запишется его позиция в строке. Если же пробелов в строке нет, find вернет константу npos, которая является максимальным возможным значением для типа size_t.


Цитата Сообщение от danrunet Посмотреть сообщение
while(x < s1.size()) // Не понятен смысл этого выражения. Возможно так ( x != -1 ). Или я чтото упустил?
Вопрос, вероятно, связан с тем, что в стандартной библиотеке npos определяется следующим образом
C++
1
static const size_t npos = -1;
Здесь нет никакого противоречия, так как size_t беззнаковый тип, поэтому -1 в дополнительном коде будет интерпретироваться как максимальное положительное значение этого типа. Поэтому, если в строке не будет найден очередной пробел условие (x < s1.size()) будет ложным и цикл прекратится.

Конечно вариант (x != -1) тоже должен работать, но грамотней было бы написать (x != string::npos)
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.01.2013, 21:22     Непонятен пример из Лафоре #3
Nagdiel, может, я не совсем понял, но интересно)
А если мы сделаем так:
C++
1
2
int _x = s1.size();
while(x < _x)
То по сути то же самое должно выйти?
Psilon
Master of Orion
5770 / 4718 / 622
Регистрация: 10.07.2011
Сообщений: 14,195
Записей в блоге: 5
Завершенные тесты: 4
08.01.2013, 21:24     Непонятен пример из Лафоре #4
Имхо грамотней вообще было бы сразу писать
C++
1
2
3
   int x;
   while((x = s1.find(' ')) < s1.size())
      s1.replace(x, 1, "/");
Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
08.01.2013, 21:32     Непонятен пример из Лафоре #5
Цитата Сообщение от BumerangSP Посмотреть сообщение
Nagdiel, может, я не совсем понял, но интересно)
А если мы сделаем так: Код C++1
2
int _x = s1.size();
while(x < _x)То по сути то же самое должно выйти?
В общем случае длина строки может в цикле измениться.

BumerangSP, к чему Ваш вопрос? Если я что-то неверно пояснил, Вы просто поправьте.
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.01.2013, 22:07     Непонятен пример из Лафоре #6
Nagdiel, длина по ходу этого цикла не меняется.
Вы пробовали сделать как я описал?
По отладке можно заметить, что x присваивается все-таки -1.
Сравнить в этом цикле x с константой и все: выход за диапазон.

Добавлено через 14 минут
Просто если бы x был типа size_t, тогда все ясно. Но здесь-то он int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 22:09     Непонятен пример из Лафоре
Еще ссылки по теме:

Наследование классов: неудачный пример из Лафоре C++
C++ Пример из книги Лафоре. Подсчитать количество слов и символов в строке
C++ Непонятен алгоритм
C++ Непонятен состав класса
Мне непонятен полный процесс создания программ на с++ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
08.01.2013, 22:09     Непонятен пример из Лафоре #7
Цитата Сообщение от BumerangSP Посмотреть сообщение
Просто если бы x был типа size_t, тогда все ясно. Но здесь-то он int.
Да, да. Я уже это понял. Спасибо за разъяснение.
Yandex
Объявления
08.01.2013, 22:09     Непонятен пример из Лафоре
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru