2016-06-02 15 views
2

, так что я везу на входе попредотвратить печать лишних пробелов в конце моей линии C++

string input,word; 
while(getline(cin, input)) { 
stringstream ss; 
ss<<input 
while(ss >> word) 
... 

и печати материала, который я хочу от cout <<word<<" ";

Однако, когда я делаю это его создает лишние пробелы в конце каждой строки, и я не хочу этого. Если я не помещаю это пробел, между словами, когда я их распечатаю, между пробелами не будет пробелов. Есть ли более простой способ отключить слова, которые я хочу, чтобы они автоматически разнесены? Что я могу сделать, чтобы предотвратить лишние пробелы в конце каждой строки.

+0

Подобно этому: https://stackoverflow.com/questions/35858896/c-compare-and-replace-last-character-of-stringstream/35859132# 35859132 и здесь: https://stackoverflow.com/questions/36137997/convert-vectorunsigned-char-1-2-3-into-string-1-2-3-as-digits/36138229#36138229 – Galik

+2

Прямо сейчас, повторное помещение пробела после слова. Вы можете исправить это, напечатав первое слово вне цикла while, а затем напечатав пробел * перед * каждым словом. Обработка первого слова по отдельности позволит избежать пробелов. – aquirdturtle

+0

Не будет std :: getline работать для этого? –

ответ

0

Трюк - который по-прежнему чувствует себя немного расстраивает - добавляет логическую переменную в смеси:

bool space = false; 
while (ss >> word) { 
    if (space) { 
     cout << " "; 
    } else { 
     space = true; 
    } 

    cout << word; 
} 
+0

К сожалению, второй пример не работает. Он проявляет ту же проблему. – Galik

+0

Я пробовал первый метод, и у меня такая же проблема. Однако я не знаю, почему. Не должен ли цикл останавливаться, как только вход останавливается? –

+0

@Galik, спасибо удален. @Gui Montag, вы должны поместить этот код в качестве замены вашего 'while (ss >> word)' и не должно быть никакой разницы в чтении ввода ... – coyotte508

3

Test первое извлечение слово вне цикла, а затем продолжить цикл с ведущими пробелами:

std::string input; 
while(getline(std::cin, input)) 
{ 
    std::istringstream ss(input); 
    std::string word; 
    if (ss >> word) 
    { 
     std::cout << word; 
     while (ss >> word) 
      std::cout << ' ' << word; 
     std::cout << '\n'; 
    } 
} 

Примечание: новая строка добавлена ​​для завершения линии. Используйте или удаляйте по своему усмотрению.

+0

Этот метод работает только в некоторых случаях из-за характера того, что я хочу делать. Предположим, мне нужно создать новую строку, только если вход, который я прочитал, - «;» если мне задан ввод, состоящий из нескольких строк с одним словом, которое не является ";" Мне нужно напечатать их в одной строке с пробелом между каждым словом. Если я это сделаю, у всех этих слов не будет промежутков между ними. –

+0

@GuiMontag Этот метод работает для * точно * проблемы, о которой ваш вопрос описал. Если вам нужно что-то еще, этот вопрос должен отражать это. В вашем комментарии «Скажем, мне нужно ... только если ...», само наличие «только если» представляет собой дополнительные булевы проверки и действия в нем. Эти проверки просто нужно перевести в код. – WhozCraig

2

Переверните проблему. Вместо добавления пробела выясните, когда вы должны добавить пробел.

Способ, которым я это делаю, - инициализировать разделитель префикса пустым значением, а затем установить его для чего-то действительного после первого элемента. В вашем случае, это было бы так:

const char *delimiter= ""; 
while(ss >> word) 
{ 
    ss >> delimiter >> word; 
    delimiter= " "; 
} 
+0

Спасибо, чувак, я думаю, что ваше решение прошло большую часть моего тестирования –

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

  • Нет связанных вопросов^_^