2015-02-15 2 views
-1

Скажите, что я хотел бы быть в состоянии COUT что-то с форматированием (то есть новая строка, вкладки)Можете ли вы использовать введенный символ новой строки (C++)?

#include <iostream> 
using namespace std; 
string str; 
int main() 
{ 
getline(cin, str); 
cout << str; 
} 

Так что я бы ввести что-то вроде Hey\nThere, чтобы получить перевод строки между эй и там. Тем не менее, он выплевывает именно то, что я напечатал (Hey\nThere). Возможно ли это сделать так, как мне бы хотелось (см. Ниже)?

Hey 
There 
+0

На какой ОС? '\ n' обычно является маркером конца строки! –

+2

Кажется, что вы хотите, чтобы ** unescape ** сбежала строка. Вам нужно будет сделать это вручную. Манипуляция строк не является магии. В ** строковых литералах ** у вас есть специальный синтаксис для escape-символов, но ** ввод user-enterd не является строковым литералом. ** Это не часть языка, поэтому он не будет автоматически отменен (что было бы ужасно). Таким образом, вам нужно будет найти '\ n' в своей строке и заменить ее символом новой строки. –

+1

Обратите внимание, что вы ищете два символа: '\\' и 'n'. Эти два должны быть переработаны одним «\ n» – deviantfan

ответ

1

Вам необходимо обработать входную строку самостоятельно. Простая реализация будет походить следующим образом:

std::string UnescapeString(std::string input){ 
    size_t position = input.find("\\"); 
    while(position != std::string::npos){ 
     //Make sure there's another character after the slash 
     if(position + 1 < input.size()){ 
      switch(input[position + 1]){ 
       case 'n': input.replace(position, 2, "\n"); break; 
       case 't': input.replace(position, 2, "\t"); break; 
       case 'r': input.replace(position, 2, "\r"); break; 
       default: break; 
      } 
     } 
     position = input.find("\\", position + 1); 
    } 
    return input; 
} 

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

+0

Могу ли я спросить, почему это так, что я должен искать «//», а не только «/»? – perhapsmaybeharry

+1

Вы должны найти «\\», потому что косая черта в коде обозначает начало escape-последовательности. Это должно устранить намерения пользователя. Если кто-то написал «\», как компилятор сможет определить, что автор имел в виду одну косую черту в строке, а не строку, начинающуюся с двойной кавычки? «\\» - это просто escape-последовательность, которая означает «испускать одну косую черту». Это, по сути, то же самое, что и «\ n», но вместо ковычки вместо новой строки. – Kaslai

Смежные вопросы