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

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

Восстановить пароль Регистрация
 
danrunet
Сообщений: n/a
08.01.2013, 20:01     Непонятен пример из Лафоре #1
В 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 20:01     Непонятен пример из Лафоре
Посмотрите здесь:

Пример из книги Лафоре C++
C++ Пример из книги Лафоре
Непонятен синтаксис C++
C++ Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Непонятен текст задания C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nagdiel
 Аватар для 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
 Аватар для BumerangSP
4283 / 1405 / 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
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 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
 Аватар для 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
 Аватар для BumerangSP
4283 / 1405 / 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++ Пример из книги Лафоре. Подсчитать количество слов и символов в строке

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

Или воспользуйтесь поиском по форуму:
Nagdiel
 Аватар для 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     Непонятен пример из Лафоре
Ответ Создать тему
Опции темы

Текущее время: 07:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru