Как cin Space в c ++? - PullRequest
       14

Как cin Space в c ++?

28 голосов
/ 04 мая 2010

Скажем, у нас есть код:

int main()
{
   char a[10];
   for(int i = 0; i < 10; i++)
   {
       cin>>a[i];
       if(a[i] == ' ')
          cout<<"It is a space!!!"<<endl;
   }
   return 0;
}

Как получить символ пробела из стандартного ввода? Если вы пишете пробел, программа игнорирует! :( Существует ли какая-либо комбинация символов (например, «\ s» или что-то подобное), которая означает «пробел», которую я могу использовать из стандартного ввода для моего кода?

Ответы [ 8 ]

41 голосов
/ 04 мая 2010

По умолчанию пропускаются все пробелы (пробелы, табуляции, новые строки и т. Д.). Вы можете либо изменить его поведение, либо использовать немного другой механизм. Чтобы изменить его поведение, используйте манипулятор noskipws следующим образом:

 cin >> noskipws >> a[i];

Но, поскольку вы, кажется, хотите посмотреть на отдельных персонажей, я бы предложил использовать get, как это до цикла

 cin.get( a, n );

Примечание: get прекратит извлекать символы из потока, если обнаружит символ новой строки (\n) или после n-1 символов. Он останавливается рано, так что он может добавить нулевой символ (\0) в массив. Подробнее об интерфейсе istream можно прочитать здесь .

17 голосов
/ 04 мая 2010
#include <iostream>
#include <string>

int main()
{
   std::string a;
   std::getline(std::cin,a);
   for(std::string::size_type i = 0; i < a.size(); ++i)
   {
       if(a[i] == ' ')
          std::cout<<"It is a space!!!"<<std::endl;
   }
   return 0;
}
5 голосов
/ 01 мая 2015

Для ввода ВСЕЙ ЛИНИИ, содержащей много пробелов, вы можете использовать getline(cin,string_variable);

например:

string input;
getline(cin, input);

Этот формат захватывает все пробелы в предложении до тех пор, пока return не будет нажата

4 голосов
/ 04 мая 2010

Используйте cin.get() для чтения следующего символа.

Однако, для этой проблемы очень неэффективно читать символ за раз. Вместо этого используйте istream::read().

int main()
{
   char a[10];
   cin.read(a, sizeof(a));
   for(int i = 0; i < 10; i++)
   {
       if(a[i] == ' ')
          cout<<"It is a space!!!"<<<endl;
   }
   return 0;
}

И используйте == для проверки равенства, а не =.

2 голосов
/ 12 октября 2016

Я думал, что поделюсь ответом, который работал для меня. Предыдущая строка заканчивалась новой строкой, поэтому большинство из этих ответов сами по себе не работали. Это сделал:

string title;
do {
  getline(cin, title);
} while (title.length() < 2);

Это предполагало, что ввод всегда был длиной не менее 2 символов, что сработало для моей ситуации. Вы также можете попробовать просто сравнить его со строкой "\n".

2 голосов
/ 04 мая 2010

Использование оператора >> в cin отбрасывает начальные пробелы и останавливает ввод в первом пробелах. Чтобы получить всю строку ввода, включая пробелы, попробуйте cin.getline(). Чтобы получить по одному символу за раз, вы можете использовать cin.get().

1 голос
/ 05 апреля 2017

Попробуйте все четыре способа получить ввод с пробелом:)

#include<iostream>
#include<stdio.h>

using namespace std;

void dinput(char *a)
{
    for(int i=0;; i++)
    {
        cin >> noskipws >> a[i];
        if(a[i]=='\n')
        {
            a[i]='\0';
            break;
        }
    }
}


void input(char *a)
{
    //cout<<"\nInput string: ";

    for(int i=0;; i++)
    {
        *(a+i*sizeof(char))=getchar();

        if(*(a+i*sizeof(char))=='\n')
        {
            *(a+i*sizeof(char))='\0';
            break;
        }

    }
}



int main()
{
    char a[20];

    cout<<"\n1st method\n";
    input(a);
    cout<<a;

    cout<<"\n2nd method\n";
    cin.get(a,10);
    cout<<a;

    cout<<"\n3rd method\n";
    cin.sync();
    cin.getline(a,sizeof(a));
    cout<<a;

    cout<<"\n4th method\n";
    dinput(a);
    cout<<a;

    return 0;
}
0 голосов
/ 08 декабря 2014

У меня та же проблема, и я просто использовал cin.getline(input,300);.

noskipws и cin.get() иногда не просты в использовании. Поскольку у вас правильный размер массива, попробуйте использовать cin.getline(), который не заботится о каком-либо символе, и прочитайте всю строку с указанным количеством символов.

...