2014-11-29 2 views
1

Так что я пытаюсь написать функцию, чтобы проверить, находится ли слово в предложении, путем циклического прохождения массива символов и проверки для той же строки char. Программа работает до тех пор, пока в Sentence нет пробелов. Я googled вокруг и они все те же предложения;std :: cin пропускает пробелы

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 для сравнения.

+0

Что на самом деле случилось с использованием 'зЬй :: GetLine()' и 'станд :: istringstream'? –

+0

Он никогда не запрашивает ввод для предложения. Вот как выглядит cmd при запуске кода. [LINK] (https://imgur.com/w5oQCEu) –

ответ

8

Хорошо, я постараюсь объяснить свою проблему:

Давайте предположим, что это ваш вход:

thisisaword
это предложение

При использовании CIN и дать ему какой-либо ввода, он останавливается на символе новой строки, который в моем примере следует за символом 'd' в 'thisisaword'.
Теперь ваша функция getline будет читать каждый символ, пока не остановит символ новой строки.
Проблема в том, что первые символы getline-встреч уже являются символом новой строки, поэтому он немедленно останавливается.

Как это происходит?

Я попытаюсь объяснить это следующим образом:

Если это ваш вход дается к программе (примечание \ п символов, рассматривать его как один символ):

thisisaword \ п
это приговор \ п

Какую функцию CIN будет принимать и оставить:

\ п
это предложение \ п

Теперь GetLine видит этот вход и проинструктирован, чтобы каждый символ, пока он не встречает символ новой строки, который является «\ п»

\ п < - О, о, это первый персонаж, с которым он сталкивается!
это приговор \ п

CIN читает ввод и листья "\ N", где GetLine включает в себя "\ п".

Чтобы преодолеть это:

\ п < - мы должны избавиться от этого так GetLine может работать
это предложение \ п

Как уже говорилось, мы не можем использовать CIN опять же потому, что он ничего не сделает. Мы можем либо использовать cin.ignore() без каких-либо параметров, и позволить ему удалить первый символ из ввода или использовать 2x getline (сначала возьмем оставшееся \ n, второе возьмет предложение с \ n)

Вы также можете избежать такая проблема переключения вашего cin >> Word; к функции 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; 

ИЛИ

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; 
+0

Блестяще благодарю вас! Я новичок в C++, поэтому, когда вы просите ввести данные от пользователя, обычно ли люди используют getline? –

+0

На самом деле это зависит от самой программы. Начинающие часто предпочитают использовать cin или scanf. getline в основном используется для чтения из файлов и выполнения строковых операций. Для меня, cin было достаточно в большинстве случаев. –

2

По умолчанию оператор >> пропускает пробелы. Вы можете изменить это поведение.

is.unsetf(ios_base::skipws) 

заставит is's >> operator лечить пробельные символы как обычные символы.

+2

Я не совсем уверен, как использовать эту строку. –

1

Как об использовании этого:

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

CIN по умолчанию использует что-то вроде этого:

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

И вы можете комбинировать флаги:

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

Скажите мне, если это работает вы:)

+0

Итак, если я правильно вас понимаю, я должен заменить строку «std :: cin >> std :: noskipws >> Sentence;»? К сожалению, он по-прежнему пропускает вход :( –

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