выравнивание вводимого текста при его выводе? - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над программой, которая, когда пользователь вводит текст, может указать, как выровнять вывод. Таким образом, пользователь вводит туда текст, а затем его спрашивают, какое выравнивание и ширину он хочет для текста (по центру, слева, справа, затем по ширине). Как бы вы получили код для ширины и выравнивания? Пока у меня есть только код, который получает ввод от пользователя, но я не уверен, как заставить программу ввести свои критерии (слева, справа, по центру и ширине), а затем выровнять ввод, заданный пользователем. Вот что у меня так далеко.

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
    vector<string> text;
    string line;

    cout << "Enter Your Text:(to start a newline click enter. When done click enter 2 times " << endl;

    while (getline(cin, line) && !line.empty())
        text.push_back(line);

    cout << "You entered: " << endl;

    for (auto &s : text)
        cout << s << endl;
    cout << "Enter Left,Center,Right and Width: ";
    return 0;
}

Я подумал, может быть, я должен использовать <iomanip>? Но я чувствую, что есть другой способ. Ввод будет что-то вроде.

Hello My Name is Willi
John Doe
and I live in 
Kansas.

И затем, когда пользователь вводит выравнивания, текст выравнивается, так что пользователь вводит выравнивание вправо, ширина 10. Выходные данные должны быть выровнены вправо (как в текстовом процессоре), и он должен иметь ширина 10 пробелов (я предполагаю, что это пробелы).

1 Ответ

0 голосов
/ 27 марта 2019

Вот простой подход. Он просто заполняет каждую строку пробелами на основе выравнивания. Выравнивание по левому краю - в основном входной текст. Вы, вероятно, также должны проверить, равна ли ширина выравнивания >= самой длинной строке ввода.

#include <iostream>
#include <string>
#include <vector>

int main() {

std::vector<std::string> text;
std::vector<std::string> output;
std::string line;
std::string align;
int width;

std::cout << "Enter Your Text (to start a newline click enter. When done click enter 2 times): \n";

while ( std::getline(std::cin, line) && !line.empty() )
    text.push_back(line);

std::cout << "You entered:\n\n";

for ( auto &s : text )
    std::cout << s << "\n";

std::cout << "Enter Left,Center,Right and Width: ";
std::cin >> align;
std::cin >> width;

for ( auto &s : text ) {

    int diff = width - s.size(),
        half = diff / 2;

    if ( align == "Right" ) {
        output.push_back( std::string(diff, ' ') + s );
    } else if ( align == "Center" ) {
        output.push_back( std::string(half, ' ') + s + std::string(diff - half, ' ') );
    } else {
        output.push_back( s );
    }

}

std::cout << "Aligned Output: \n\n";

for ( auto &s : output )
    std::cout << s << "\n";

return 0;

}

Тестовые случаи (фактический вывод имеет пробелы, а не *):

Ввод (выравнивание = вправо, ширина = 10):

Hello my
name is
John Doe

Выход:

**Hello my
***name is
**John Doe

Ввод (выравнивание = центр, ширина = 16):

Hello my name
is
John Doe

Выход:

*Hello my name**
*******is*******
****John Doe****
...