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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
#1

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

16.03.2014, 14:14. Просмотров 1487. Ответов 8
Метки нет (Все метки)

Добрый день! Такой код:

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 строки?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 14:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поведение setw(). Откуда берутся начальные отступы, начиная со 2 строки? (C++):

Откуда берутся все символы после моей строки? - C++
Народ, кому не трудно ,обоснуйте природу выводимого при выполнении программы #include &lt;cstdlib&gt; #include &lt;iostream&gt; using...

Откуда берутся странные числа? - C++
Добрый вечер! Не можете подсказать, почему такие значения Z??? А не 1, 2, 3, 4??? Программа работает правильно, как вроде. #include...

Откуда берутся лишние элементы? - C++
String String::operator + (String right){ int len = strlen(this-&gt;myString) + strlen(right.myString); cout &lt;&lt; len&lt;&lt; endl;// 14 ...

Откуда берутся символы при ошибках? - C++
Иногда,когда программа содержит код с ошибками,начинают выскакивать какие-то колдунские символы,вроде 00FD...,-857... и тд.Откуда они? ...

Откуда берутся лишние цифры в double? - C++
У меня значения из примера выше близкие к правильным, но есть косяки - 1)в числе 3.12, откуда то появилась единица в самом последнем...

Откуда берутся лишние символы при создании массива с помощью оператора new? - C++
Здравствуйте) Наблюдаю странное поведение оператора new. ifstream is; is.open(&quot;f.txt&quot;); is.seekg (0, ios::end); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
16.03.2014, 14:17 #2
Так setw(3) же. Если вопрос в том, почему нет в 1-й строке, - потому что setw здесь вызывается после вывода i.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.03.2014, 14:18 #3
serg47, setw() нужно выполнять ДО вывода информации.
0
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 14:28  [ТС] #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 строки?
0
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
16.03.2014, 14:37 #5
setw устанавливает ширину поля для следующего вывода. "\n" - это вывод в поток, endl - нет, поэтому после вывода "\n" ширина уже сбрасывается.
2
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.03.2014, 14:41 #6
Цитата Сообщение от serg47 Посмотреть сообщение
но если в 11 строке endl заменить на "\n", то все получается!
Потому что это не равнозначные замены. Когда используется std::endl, предшествующий ему вызов std::setw не учитывается при переводе строки, а будет использован при следующем выводе числа (21, 31, 41 ... ). Если же использовать "\n", то std::setw используется для перевода строки, а для чисел (21, 31, 41 ...) уже нет.
Чтобы лучше понять это, попробуйте добавить
C++
1
cout << setfill('_');
до вызова цикла.
1
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 15:12  [ТС] #7
Спасибо! Понял. А как было бы правильнее написать такую программку?(Как бы Вы написали?)
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.03.2014, 15:14 #8
Цитата Сообщение от serg47 Посмотреть сообщение
А как было бы правильнее написать такую программку?
Просто исправить вывод:
C++
1
 cout << setw(3) << i;
1
serg47
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 15
16.03.2014, 16:10  [ТС] #9
Разобрался. А если не нужен первый "пробел", написать так:
C++
1
cout << setw(3) << left << i;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 16:10
Привет! Вот еще темы с ответами:

Неправильный вывод UTF8 строки вместе с setw - C++
Есть файл с UTF8 строкой. Считываем его и выводим во второй файл с выравниванием. В результате выравнивание нету. Почему так? Чем...

Верстка div - откуда берутся отступы? - HTML, CSS
Наложил сверху блок div красного цвета, почему присутствуют отступы с права, лева и и сверху. &lt;html&gt; &lt;head&gt; &lt;style...

Откуда берутся 3 часа - PHP
$lost_time = date(&quot;H:i:s&quot;, $result - $res); Нужно перевести в такой формат оставшееся время. в $result = (int)25; //cекунд ...

Откуда они берутся? - Windows 7
После загрузки, система видит съемные диски которых нет. Это как? Началось сегодня, когда включил компьютер. 1) Первое включение ...


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

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

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