У меня возникли проблемы с пониманием назначения функции setw(n) в C++

Я изучал C++ по учебнику, и, на мой взгляд, их объяснения назначения функций setw() были плохими. Проще говоря, я не понимаю назначение этих функций, да и онлайн-объяснения мало чем помогли. Я читал, что он устанавливает ширину поля, которая будет использоваться в операциях вывода, или устанавливает параметр ширины исходящего или входящего потока ровно n, но что, черт возьми, это значит? Прежде чем вы ответите на этот вопрос, у меня есть два кода, A и B, которые лучше иллюстрируют мое замешательство.

Код А: (пример кода из учебника):

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int main() 
{
   string label; 
   double price;  
  
   cout << "\nPlease enter an article label: ";
 
   cin >> setw(16);        
   cin >> label;

   cin.sync();    
   cin.clear();   

   cout << "\nEnter the price of the article: ";
   cin >> price;           
 
   cout << fixed << setprecision(2)
        << "\nArticle:"
        << "\n  Label:  " << label
        << "\n  Price:  " << price << endl;
  
return 0;

}

пример ввода: Пожалуйста, введите метку статьи: компьютер Введите цену статьи: 75

выход:

Артикул: Этикетка: компьютер Цена: 75.00

Код B: (почти тот же код, что и A, но с тремя закомментированными строками)

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int main() 
{
   string label; 
   double price;  
  
   cout << "\nPlease enter an article label: ";
 
   //cin >> setw(16);        
   cin >> label;

   //cin.sync();    
   //cin.clear();   

   cout << "\nEnter the price of the article: ";
   cin >> price;           
 
   cout << fixed << setprecision(2)
        << "\nArticle:"
        << "\n  Label:  " << label
        << "\n  Price:  " << price << endl;
  
return 0;

}

пример ввода: Пожалуйста, введите метку статьи: компьютер Введите цену статьи: 75

на выходе: Артикул: Этикетка: компьютерная Цена: 75.00

В коде B я закомментировал строки setw(16), cin.sync() и cin.clear(), но не вижу никаких изменений в выводе независимо от того, закомментированы строки или нет. Итак, мой вопрос: какова цель этих строк? Что выигрывает код A, имея эти дополнительные строки, по сравнению с кодом B, в котором их нет? Есть ли какие-то входные данные, которые приведут к тому, что выходы A и B будут разными, или это разница, которую нельзя увидеть глазами? Кроме того, какова цель целого числа n в строке наборов (n). Я изменил это число на разные значения, такие как 16, 78, 100, 10000 и т. д., но это также не меняет выходные данные двух кодов. Спасибо.


person binary44563    schedule 18.01.2021    source источник
comment
Вы сохраняли и перекомпилировали после изменения кода? Похоже, что нет.   -  person sweenish    schedule 19.01.2021
comment
Дополните учебник cppreference.com, например std::setw   -  person David C. Rankin    schedule 19.01.2021


Ответы (1)


Возьмем этот код:

#include <iostream>
#include <iomanip>

int main() {
    double value = 1234567890.321654987;
    
    std::cout << value << '\n';
    
    std::cout << std::setw(20) << value << '\n';
    std::cout << std::setw(2) << value << '\n';
    
    
    std::cout << std::setprecision(2) << value << '\n';
    std::cout << std::setprecision(20) << value << '\n';
}

Он печатает:

1.23457e+09
         1.23457e+09
1.23457e+09
1.2e+09
1234567890.321655035

Ширина — это минимальное количество символов: при необходимости могут быть добавлены пробелы.

Точность - это количество цифр. Первый отпечаток использует точность по умолчанию (по-видимому, 6).

person Bktero    schedule 18.01.2021