std :: cin跳过空格

时间:2014-11-29 18:00:00

标签: c++ cin spaces

所以我试着编写一个函数来检查一个单词是否在一个句子中,通过循环一个char数组并检查相同的char字符串。只要句子没有任何空格,该程序就可以运行。我用Google搜索,他们都是相同的建议;

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进行比较。

3 个答案:

答案 0 :(得分:14)

好的,我会尝试解释你的问题:

我们假设这是您的输入:

  

thisisaword
  这是一句话

当你使用cin并给它任何输入时,它会停止在换行符中,在我的例子中跟随字符&#39; d&#39;在&#39; thisisaword&#39;。
现在,你的getline函数将读取每个字符,直到它停止换行符。
问题是,遇到第一个字符的getline已经是换行符,所以它会立即停止。

这是怎么回事?

我会尝试这样解释:

如果这是您对程序的输入(注意\ n字符,请将其视为单个字符):

  

thisisaword \ n
  这是一句话\ n

你的cin功能将带走和离开:

  

\ n
  这是一句话\ n

现在getline看到了这个输入,并被指示获取每个角色,直到遇到换行符为&#34; \ n&#34;

  

\ n&lt; - 哦,这就是它遇到的第一个角色!   这是一句话\ n

cin读取输入并离开&#34; \ n&#34;,其中getline包含&#34; \ n&#34;。

要克服这个问题:

  

\ n&lt; - 我们需要摆脱这个,所以getline可以工作   这是一句话\ n

如上所述,我们不能再使用cin,因为它什么也不做。 我们可以使用没有任何参数的cin.ignore()并让它从输入中删除第一个字符或使用2x getline(第一个将取剩余的\ n,第二个将使用\ n的句子)

你也可以避免这种问题切换你的cin&gt;&gt;字;到getline函数。

由于这被标记为C ++,因此我将Char * []更改为字符串:

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;

答案 1 :(得分:7)

如何使用它:

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

cin默认使用这样的东西:

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

你可以组合旗帜:

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

告诉我它是否适合你:)

答案 2 :(得分:3)

默认运营商&gt;&gt;跳过白色空间。您可以修改该行为。

is.unsetf(ios_base::skipws)

会导致is's >> operator将空格字符视为普通字符。