2010-05-04 4 views
24

Скажем, у нас есть код:Как cin Пространство в C++?

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; 
} 

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

+0

Насколько я помню пространство (пробелы?) Используется для разделения различных входов. Может быть, вам нужно использовать char * Line; чтобы получить пространство включительно. – khmarbaise

+3

Пожалуйста, измените '<<<' на '<<' и используйте '==' для проверки равенства. Эти опечатки отвлекают ответы. – Geoff

+0

Примечание: термин командной строки здесь не имеет особого значения. Командная строка преобразуется в параметры, переданные в main() в качестве параметров argv. std :: cin читает со стандартного ввода (который по умолчанию подключен к пользовательской клавиатуре). –

ответ

35

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

cin >> noskipws >> a[i]; 

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

cin.get(a, n); 

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

+1

Что, черт возьми, n? – dylnmc

+2

@ dylnmc Вы прочитали сообщение? Таким образом, вы заметили бы, что я заявляю, что 'cin.get' возвращает строки n-1 из потока. – rcollyer

+0

Да; нет n – dylnmc

4

Использование 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

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

+4

Обратите внимание, что 'std :: istream :: getline()' имеет дело с символьными буферами и, следовательно, имеет риск переполнения буфера. Лучше использовать 'std :: getline (std :: istream &, std :: string &, char c = '')' от ''. – sbi

+2

@sbi: Должен ли последний параметр быть 'char c = '\ n''? – tiftik

+1

Оператор >> отбрасывает ведущее белое пространство, считывая целевой объект, используя пробел в качестве разделителя (поэтому для стандартных POD перестает считывать цель в первом пространстве). (Таким образом, он не «заканчивается» в первом белом пространстве). Также обратите внимание: будьте очень осторожны при использовании термина «terminate», он имеет очень четкое значение, когда говорит о C++ –

16
#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; 
} 
+0

Я хочу использовать char, но не std :: string. Меня интересует, что делать с char []. В любом случае, спасибо. – Narek

+0

вы все равно можете получить символы с помощью функции c_str() или с помощью оператора [], который отображается в этом ответе. строка также предоставит вам кучу полезных функций: http://www.cplusplus.com/reference/string/string/ – Default

+1

@ Нарек: Надеюсь, у вас есть очень веская причина, чтобы иметь дело с голыми буферами 'char' и я надеюсь, что вы знаете о них больше, чем знаете об iostreams. – sbi

0

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

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

5

Для входа целой строки, содержащая много пространства вы можете использовать getline(cin,string_variable);

например:

string input; 
getline(cin, input); 

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

2

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

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

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

1

Попробуйте все четыре способа взять вход с пространством :)

#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; 
}