2010-05-04 15 views
24

Dire che abbiamo un codice:Come cin Space in 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; 
} 

Come cin un simbolo dello spazio dallo standard input? Se scrivi spazio, il programma ignora! :( C'è qualche combinazione di simboli (ad esempio '\ s' o qualcosa di simile), che significa "spazio" che posso usare dallo standard input per il mio codice?

+0

Per quanto posso ricordare lo spazio (spazi bianchi?) Viene utilizzato per separare i vari ingressi. Potrebbe essere necessario utilizzare una linea char *; per ottenere lo spazio inclusivo. – khmarbaise

+3

Per favore cambia '<<<' in '<<' e usa '==' per verificare l'uguaglianza. Questi errori di battitura distraggono le risposte. – Geoff

+0

Nota: il termine riga di comando non è molto pertinente qui. La riga di comando viene convertita in parametri passati a main() come parametri argv. std :: cin legge dallo standard input (che di default è collegato alla tastiera dell'utente). –

risposta

35

Ignora tutti gli spazi bianchi (spazi, tabulazioni, nuove linee, ecc.) Per impostazione predefinita. Puoi modificare il suo comportamento o utilizzare un meccanismo leggermente diverso. Per modificare il suo comportamento, utilizzare il manipolatore noskipws, come segue:

cin >> noskipws >> a[i]; 

Ma, dal momento che sembra come si vuole guardare i singoli caratteri, suggerirei usando get, come questo prima del vostro ciclo

cin.get(a, n); 

Nota: get interromperà il recupero di caratteri dallo stream se trova un carattere di nuova riga (\n) o dopo caratteri n-1. Si arresta in anticipo in modo che possa aggiungere il carattere null (\0) all'array. Puoi leggere ulteriori informazioni sull'interfaccia istreamhere.

+1

che diavolo è n? – dylnmc

+2

@dylnmc hai letto il post? Avresti notato, quindi, che dichiaro 'cin.get' restituisce' n - 1' caratteri dallo stream. – rcollyer

+0

sì; non c'è n – dylnmc

4

Usa cin.get() per leggere il carattere successivo.

Tuttavia, per questo problema, è molto inefficiente per leggere un carattere alla volta. utilizzare la istream::read() invece.

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

E utilizzare == per controllare l'uguaglianza, non =.

2

L'uso dell'operatore di cin >> farà cadere spazi bianchi iniziali e interromperà l'input al primo spazio vuoto finale. Per afferrare un'intera riga di input, inclusi gli spazi, prova a cin.getline(). Per prendere un personaggio alla volta, puoi usare cin.get().

+4

Si noti che 'std :: istream :: getline()' si occupa dei buffer di caratteri e quindi presenta il rischio di overflow del buffer. Meglio usare 'std :: getline (std :: istream &, std :: string &, char c = '')' da ''. – sbi

+2

@sbi: l'ultimo parametro non dovrebbe essere 'char c = '\ n''? – tiftik

+1

L'operatore >> abbandona lo spazio bianco iniziale, legge l'oggetto target usando lo spazio bianco come delimitatore (quindi per i POD standard smetterà di leggere l'obiettivo nel primo spazio). (Quindi non "termina" nel primo spazio bianco). Inoltre, fai molta attenzione nell'uso del termine 'terminate' ha un significato molto esplicito quando si parla di 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

Voglio usare char, ma non std :: string. Sono interessato a fare ciò che voglio con char []. Comunque grazie. – Narek

+0

è ancora possibile ottenere i caratteri tramite la funzione c_str() o tramite l'operatore [] visualizzato in questa risposta. stringa ti fornirà anche un sacco di utili funzioni: http://www.cplusplus.com/reference/string/string/ – Default

+1

@Narek: spero che tu abbia una buona ragione per voler affrontare i buffer 'char' nudi e spero che tu sappia di più su di loro di quanto tu sappia sugli iostreams. – sbi

0

Ho lo stesso problema e ho appena usato cin.getline(input,300);.

noskipws e cin.get() a volte non sono facili da usare. Dal momento che hai le giuste dimensioni del tuo array prova a usare cin.getline() che non interessa a nessun personaggio e leggere l'intera riga nel numero di caratteri specificato.

5

Per inserire una linea INTERO contenente sacco di spazi è possibile utilizzare getline(cin,string_variable);

esempio:

string input; 
getline(cin, input); 

Questo formato cattura tutti gli spazi nella frase fino return viene premuto

2

ho pensato che 'd condividere la risposta che ha funzionato per me. La riga precedente terminava in una nuova riga, quindi la maggior parte di queste risposte da sole non funzionava. Questo ha fatto:

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

Ciò presupponeva che l'input fosse sempre lungo almeno 2 caratteri, il che ha funzionato per la mia situazione. Potresti anche provare semplicemente a confrontarlo con la stringa "\n".

1

Prova questa tutti e quattro modo di prendere l'input con spazio :)

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