#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
Inmain
является избыточным.
Комментарии:
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. Ага, теперь я понял.