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

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

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

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

08.01.2013, 20:01. Просмотров 383. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 20:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятен пример из Лафоре (C++):

Пример из книги Лафоре - C++
В третьей главе книги Лафоре по с++ есть пример использующий функцию getche(): #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Пример из книги Лафоре - C++
Здравствуйте! Не могли бы подсказать, по какой причине в листинге ниже переменные должны быть обязательно быть изначально изначально с...

Лафоре Не компилируется пример - C++
Вот текст кода#include &quot;msoftcon.h&quot; class Shape { protected: int xCo, yCo; color fillcolor; fstyle fillstyle; ...

Не работает пример из книги Лафоре - C++
Доброго времени суток! Взялся решать задачу из книги Лафоре, глава 9, упр. 2. Опробовал уже готовое решение из самой книги- не работает. ...

Наследование классов: неудачный пример из Лафоре - C++
И снова всем доброй ночи :). Начал читать про наследование классов и совсем запутался может быть вы мне растолкуете в чем ошибка и чего я...

Пример из книги Лафоре. Подсчитать количество слов и символов в строке - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; // для getche() using namespace std; int main() { setlocale(LC_ALL, &quot;Rus&quot;); int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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)
1
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.01.2013, 21:22 #3
Nagdiel, может, я не совсем понял, но интересно)
А если мы сделаем так:
C++
1
2
int _x = s1.size();
while(x < _x)
То по сути то же самое должно выйти?
0
Psilon
Master of Orion
Эксперт .NET
5891 / 4788 / 634
Регистрация: 10.07.2011
Сообщений: 14,406
Записей в блоге: 5
Завершенные тесты: 4
08.01.2013, 21:24 #4
Имхо грамотней вообще было бы сразу писать
C++
1
2
3
   int x;
   while((x = s1.find(' ')) < s1.size())
      s1.replace(x, 1, "/");
0
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, к чему Ваш вопрос? Если я что-то неверно пояснил, Вы просто поправьте.
0
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.01.2013, 22:07 #6
Nagdiel, длина по ходу этого цикла не меняется.
Вы пробовали сделать как я описал?
По отладке можно заметить, что x присваивается все-таки -1.
Сравнить в этом цикле x с константой и все: выход за диапазон.

Добавлено через 14 минут
Просто если бы x был типа size_t, тогда все ясно. Но здесь-то он int.
1
Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
08.01.2013, 22:09 #7
Цитата Сообщение от BumerangSP Посмотреть сообщение
Просто если бы x был типа size_t, тогда все ясно. Но здесь-то он int.
Да, да. Я уже это понял. Спасибо за разъяснение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 22:09
Привет! Вот еще темы с ответами:

Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой - C++
Изучаю C++ по книге Р. Лафоре. Дошёл до 5-ой главы, и мне встретился пример использования консольной графики. Страница 179. Пример...

Непонятен синтаксис - C++
Доброго времени суток! Хотелось бы попросить вашего совета. код double **E = new double *; в данном отрывке...

Непонятен алгоритм - C++
Здравствуйте. Не подскажете какой здесь сделать алгоритм? Собственно, сама задачка: Дан набор гирек массой m1, …, mN. Можно ли их...

Непонятен состав класса - C++
Не могли бы ли вы объяснить выделенные 10 строк??? #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;cstring&gt; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.01.2013, 22:09
Ответ Создать тему
Опции темы

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