web-dev-qa-db-ja.com

C ++でスペースをCINする方法は?

コードがあるとします:

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」など)の組み合わせはありますか?

29
Narek

デフォルトでは、すべての空白(スペース、タブ、改行など)をスキップします。動作を変更するか、わずかに異なるメカニズムを使用できます。その動作を変更するには、次のようにマニピュレーターnoskipwsを使用します。

 cin >> noskipws >> a[i];

しかし、あなたは個々の文字を見たいように見えるので、ループの前にこのようにgetを使用することをお勧めします

 cin.get( a, n );

注:getは、改行文字を検出した場合、ストリームからの文字の取得を停止します(\n)またはn-1文字後。ヌル文字(\0)配列に。 istreamインターフェイスの詳細については、こちらをご覧ください こちら

42
rcollyer
#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;
}
17
sbi

多くのスペースを含む完全な行を入力するには、getline(cin,string_variable);を使用できます

例えば:

string input;
getline(cin, input);

この形式は、returnが押されるまで文のすべてのスペースをキャプチャします

5
Nidhin David

cin.get()を使用して、次の文字を読み取ります。

ただし、この問題の場合、一度に1つの文字を読み取ることは非常に非効率的です。代わりに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;
}

そして、==ではなく、=を使用して同等性を確認します。

4
Marcelo Cantos

Cinの>>演算子を使用すると、先頭の空白が削除され、最初の末尾の空白で入力が停止します。スペースを含む入力行全体を取得するには、cin.getline()を試してください。一度に1文字を取得するには、cin.get()を使用できます。

3
Odrade

私は私のために働いた答えを共有すると思いました。前の行は改行で終わっていたため、これらの回答のほとんどは機能しませんでした。これは:

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

これは、入力が常に少なくとも2文字の長さであると想定していたため、私の状況ではうまくいきました。文字列"\n"と単純に比較することもできます。

2
Airhogs777

スペースを使用して入力を取得するには、この4つの方法をすべて試してください。

#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;
}
1
Abhishek Sahay

同じ問題があり、cin.getline(input,300);を使用しました。

noskipwscin.get()は使いにくい場合があります。配列のサイズは適切であるため、cin.getline()を使用してください。これは、文字を気にせず、指定した文字数で行全体を読み取ります。

0
HamzeLue