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

Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 14:14     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #1
Добрый день! Такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
    {
    for (int i = 11; i <= 99; i++)
        {
        cout << i << setw(3);
        if (!(i % 10))
            cout << endl;
        }
    cout << endl;
 
return 0;
}
Вот вывод в консоль:

Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки?

Подскажите откуда берутся начальные отступы, начиная со 2 строки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 14:14     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки?
Посмотрите здесь:

Удалить начальные пробелы из строки... C++
Функция удаляет начальные пробелы из строки... C++
C++ Удалить из строки начальные пробелы
Откуда берутся все символы после моей строки? C++
C++ Откуда берутся странные числа?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
16.03.2014, 14:17     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #2
Так setw(3) же. Если вопрос в том, почему нет в 1-й строке, - потому что setw здесь вызывается после вывода i.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.03.2014, 14:18     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #3
serg47, setw() нужно выполнять ДО вывода информации.
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 14:28  [ТС]     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #4
Да, но если в 11 строке endl заменить на "\n", то все получается!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
    {
    for (int i = 11; i <= 99; i++)
        {
        cout << i << setw(3);
        if (!(i % 10))
            cout << "\n";
        }
    cout << endl;
 
return 0;
}
Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
16.03.2014, 14:37     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #5
setw устанавливает ширину поля для следующего вывода. "\n" - это вывод в поток, endl - нет, поэтому после вывода "\n" ширина уже сбрасывается.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.03.2014, 14:41     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #6
Цитата Сообщение от serg47 Посмотреть сообщение
но если в 11 строке endl заменить на "\n", то все получается!
Потому что это не равнозначные замены. Когда используется std::endl, предшествующий ему вызов std::setw не учитывается при переводе строки, а будет использован при следующем выводе числа (21, 31, 41 ... ). Если же использовать "\n", то std::setw используется для перевода строки, а для чисел (21, 31, 41 ...) уже нет.
Чтобы лучше понять это, попробуйте добавить
C++
1
cout << setfill('_');
до вызова цикла.
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 15:12  [ТС]     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #7
Спасибо! Понял. А как было бы правильнее написать такую программку?(Как бы Вы написали?)
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.03.2014, 15:14     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #8
Цитата Сообщение от serg47 Посмотреть сообщение
А как было бы правильнее написать такую программку?
Просто исправить вывод:
C++
1
 cout << setw(3) << i;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 16:10     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки?
Еще ссылки по теме:

Откуда берутся лишние элементы? C++
Неправильный вывод UTF8 строки вместе с setw C++
Откуда берутся лишние символы при создании массива с помощью оператора new? C++

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

Или воспользуйтесь поиском по форуму:
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 16:10  [ТС]     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? #9
Разобрался. А если не нужен первый "пробел", написать так:
C++
1
cout << setw(3) << left << i;
Yandex
Объявления
16.03.2014, 16:10     Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки?
Ответ Создать тему
Опции темы

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