Всякий раз, когда я пытаюсь использовать setfill manipulator на C , он просто отображает пробелы

#c #visual-c

#c #visual-c

Вопрос:

Это мой код для простой попытки заполнить пробелы * :

 #include <iostream>
#include <iomanip>

using namespace std;

int main() {
    cout << setw(10) << setfill('*');
    cout << endl;
    system("pause");
    return 0;
}
  

Однако программа просто отображает пробелы, другими словами, она просто отображает пустую строку!

Итак, пожалуйста, что с этим не так?

Примечание: Я попытался скомпилировать на VS 2015 и GCC 4.9.2 и получил тот же результат.

Комментарии:

1. Он заполняет выходные поля.

2. Вы ничего не выводили; попробуйте cout << ""; .

Ответ №1:

std::endl причина, по которой ваши манипуляторы игнорируются:

Вставляет символ новой строки в выходную последовательность os и сбрасывает его, как будто вызывая, os.put(os.widen('n')) за которым os.flush() следует.

put Вызов в первой части является виновником. Вы можете свести свою проблему к нему, о чем свидетельствует следующий эксперимент, который будет записывать только x в выходные данные:

 #include <iostream>
#include <iomanip>

int main() {
    std::cout << std::setw(10) << std::setfill('*');
    std::cout.put('x');
}
  

Проблема в том, что put выполняется неформатированный вывод:

Ведет себя как unformattedoutputфункция.

Исправить легко: просто не используйте std::endl . Используйте "n" . Вам все равно следует предпочесть "n" .

 #include <iostream>
#include <iomanip>

using namespace std;

int main() {
    cout << setw(10) << setfill('*');
    cout << "n";
    system("pause");
    return 0;
}
  

Это сгенерирует желаемый результат:

 *********
  

И пока мы этим занимаемся:

  • Избегайте using namespace std .
  • Не используйте system("pause") .
  • return 0 In main является избыточным.

Комментарии:

1. Хотя я не понимаю часть put, я всего лишь программист pudding, я понимаю, что проблемы заключаются в endl, однако я не совсем уверен, что отличает endl от ‘ n’.

2. Почему следует избегать использования пространства имен std? Мне просто кажется, что вы знаете, что печатать меньше? System («пауза») используется здесь только в целях тестирования, поскольку консоль просто включается и выключается менее чем за секунду. Поправьте меня, если я ошибаюсь, если основная функция имеет тип int, разве она не должна что-то возвращать?

3. Большое спасибо, в любом случае, я бесконечно благодарен.

Ответ №2:

Вам нужно что-то записать в std::cout.

 #include <iostream>
#include <iomanip>
using namespace std;
int main() {
    cout << setw(10) << setfill('*') << "" << std::endl;
    cout << setw(10) << setfill('*') << 1 << std::endl;
    cout << endl;
    system("pause");
    return 0;
}
  

Комментарии:

1. Так же, как и в другом ответе: разрыв строки -это что-то, но std::endl заставляет манипуляторы формата игнорироваться.

2. Почему из-за разрыва строки манипуляторы формата игнорируются?

Ответ №3:

Вы должны что-то написать перед заполнением с помощью «*» :

 #include <iostream>
#include <iomanip>

using namespace std;

int main() {
    cout << "test" ;
    cout << setw(10) << setfill('*');
    cout << "test" ;
    cout << endl;
    system("pause");
    return 0;
}
  

Комментарии:

1. Он действительно что-то пишет. Разрыв строки — это определенно что-то. Проблема в том, что перевод строки записывается так, как будто с вызовом put , который игнорирует манипуляторы формата.

2. Ага, теперь я понял.