web-dev-qa-db-ja.com

std :: cinは空白をスキップします

そのため、char配列をループして同じ文字列をチェックすることにより、Wordが文に含まれているかどうかをチェックする関数を作成しようとしています。センテンスにスペースがない限り、プログラムは機能します。私はグーグルで検索しましたが、それらはすべて同じ提案です。

cin.getline

しかし、私がそれを実装したとしても、それは実行されないか、入力全体をスキップして、出力に向かってまっすぐ進みます。

スペースをどのように説明できますか?

#include <iostream>


using namespace std;

bool isPartOf(char *, char *);

int main()
{
char* Word= new char[40];
char* Sentence= new char[200];

cout << "Please enter a Word: ";
cin >> Word;
cout << endl << "Please enter a sentence: "; 

//After Word is input, the below input is skipped and a final output is given.
cin.getline(Sentence, 190); 
cout << endl;

if (isPartOf(Word, Sentence)==true)
    {
        cout << endl << "It is part of it.";
    }
else
    {
       cout << endl << "It is not part of it.";
    }
}

bool isPartOf(char* a, char* b) //This is the function that does the comparison. 
{
    int i,j,k;

for(i = 0; b[i] != '\0'; i++)
{
j = 0;

if (a[j] == b[i])
{
    k = i;
    while (a[j] == b[k])
    {

        j++;
        k++;
        return 1;
        if (a[j]=='\0')
            {
                break;
            }
        }

    }


}
return 0;
}

そして、私は比較のためにstrstrを使用することを許可されていません。

6
Pejman Poh

わかりました、私はあなたの問題を説明しようとします:

これがあなたの入力であると仮定しましょう:

thisisaword
これは文です

Cinを使用して入力を行うと、改行文字で停止します。この例では、「thisisaword」の文字「d」の後に続きます。
これで、getline関数は、改行文字を停止するまですべての文字を読み取ります。
問題は、getlineが最初に遭遇する文字がすでに改行であるため、すぐに停止することです。

これはどのように起こっていますか?

私はそれを次のように説明しようとします:

これがプログラムに与えられた入力である場合(\ n文字に注意してください。単一の文字のように扱ってください):

thisisaword\n
これは文です\ n

あなたのcin関数が何を取り去るか:

\ n
これは文です\ n

これで、getlineはこの入力を確認し、「\ n」である改行文字に出会うまですべての文字を取得するように指示されます。

\ n <-ああ、それが最初に出会うキャラクターです!
これは文です\ n

cinは入力を読み取り、「\ n」を残します。ここで、getlineには「\ n」が含まれます。

これを克服するには:

\ n <-getlineが機能するように、これを取り除く必要があります
これは文です\ n

すでに述べたように、cinは何もしないため、再び使用することはできません。パラメータなしでcin.ignore()を使用して、入力から最初の文字を削除するか、2x getlineを使用することができます(最初は残りの\ nを取り、2番目は\ nを含む文を取ります)

Cin >> Wordを切り替えるこの種の問題を回避することもできます。 getline関数に。

これはC++としてタグ付けされているため、この例ではChar * []をStringsに変更しました。

string Word, Sentence;

cout << "Please enter a Word: "; cin >> Word;
cout << endl << Word;

cin.ignore();

cout << "\nPlease enter a sentence: "; getline(cin, Sentence); 
cout << endl << Sentence;

OR

string Word, Sentence;

cout << "Please enter a Word: "; getline(cin, Word); 
cout << endl << Word;

cout << "\nPlease enter a sentence: "; getline(cin, Sentence); 
cout << endl << Sentence;
14
Patryk Krawczyk

これを使ってみませんか:

std::cin >> std::noskipws >> a >> b >> c;

cinはデフォルトで次のようなものを利用します:

std::cin >> std::skipws >> a >> b >> c;

そして、フラグを組み合わせることができます。

std::cin >> std::skipws >> a >> std::noskipws >> b;

それがあなたのために働くかどうか教えてください:)

7
Patryk Krawczyk

デフォルトでは、演算子>>は空白をスキップします。その動作を変更できます。

is.unsetf(ios_base::skipws)

is's >> operatorは空白文字を通常の文字として扱います。

3
ravi