2015-06-02 2 views
2

Я хочу иметь возможность выводить несколько строк и иметь их все отступы на указанное количество символов. Таким образом, если мы имеемОтступы многострочного вывода по указанному числу символов

int n = 3; 

это будет количество символов для отступа, а затем мы имели строку,

string s = "This is a string.\nThis is a string.\nThis is a string\n"; 

и я должен был затем вывести строку,

cout << s; 

Как я могу сделать так, чтобы каждая строка, которая выводится, отступала от n?

+0

Это своего рода запутанное, но вы должны создать свой собственный тип потока, который оборачивает в основной поток и добавляет отступы в каждой найденной строке. –

+0

Я с удовольствием вижу ответ ... в основном, goas беспорядок с буферами и substiture \ n с \ n + n пробелами ... – marom

+0

@buttifulbuttefly Я надеялся, что было более простое решение, но, в порядке, я буду загляните в нее. – frontin

ответ

2

Неожиданным решением было бы найти все экземпляры \n в строке для печати и добавить строку, содержащую пробельные символы указанной длины после каждого появления "\n".

если ss является строка, которая будет напечатана, и empty это строка, содержащая знаки пробела, а затем заменить все экземпляры "\n" в ss по "\n" + empty

Обратитесь к How to find and replace string? для кода делать это.

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

+0

Итак, это именно то, о чем я думал и искал, но в отношении кода будет 's.replace (s.find (" \ n "), 2," \ n "+ пробелы)' заменить все экземпляры '\ n' или только первый? Я не получил этого разъяснения в вашей ссылке. – frontin

+0

Я думаю, что главный ответ заменит только одно событие. Если хотите, вы можете посмотреть библиотеку Boost во втором ответе. Иначе, обратитесь к этому вопросу: http://stackoverflow.com/questions/5343190/how-do-i-place-all-instances-of-of-a-string-with-another-string – therainmaker

1

Инициализировать переменную string, которая будет хранить пробелы, а затем добавить пробелы к ней путем циклирования.

int n = 3; 
string indents; 

for (int c = 0; c < n; c++) 
    indents += " "; 

Объединяя все в одной строке,

string s = "This is a string.\n" + indents + "This is a string.\n" + indents + "This is a string\n" + indents; 

cout << s;

EDIT: Поскольку вы упомянули, что вхождения или позиции \n неизвестны,

Вы можете использовать string::find, чтобы найти первый oc currence \n, затем добавьте n пробелов после него, используя string::insert, затем зациклируйте до тех пор, пока не будут найдены все вхождения \n и после него будут добавлены пробелы.

int n = 3; 
string s = "This is a string.\nThis is a string.\nThis is a string\n"; 

// first occurrence 
size_t pos = s.find("\n"); 

while (pos != string::npos) { 

    // insert n spaces after \n 
    s.insert(pos + 1, n, ' '); 

    // find the next \n 
    pos = s.find("\n", pos + 1); 
} 
cout << s; 

Выход

This is a string. 
    This is a string. 
    This is a string. 
+0

Так что я получил далеко достаточно, чтобы я использовал аналогичную идею для пространств с «строковыми пробелами» (n, ''); 'но проблема в том, что я не буду знать, где находятся строки новой строки или если они вообще будут, так что Я предполагаю, что мне нужно будет выполнить поиск и найти индекс всех символов \ n и добавить пробелы. – frontin

+0

Если это так, вы можете взглянуть на эту ссылку: http://www.boost.org/doc/libs/1_42_0/doc/html/boost/algorithm/replace_all.html – raymelfrancisco