2010-05-04 12 views
24

Sagen wir einen Code haben:Wie 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; 
} 

Wie ein Raum Symbol von der Standardeingabe cin? Wenn Sie Leerzeichen schreiben, ignoriert das Programm! :( Gibt es eine Kombination von Symbolen (zB ‚\ s‘ oder so ähnlich), die „Space“ bedeutet, dass ich von der Standardeingabe für meinen Code verwenden kann?

+0

Soweit ich den Raum (Leerzeichen?) Erinnern kann, verwendet wird, um die verschiedenen Eingänge zu trennen. Möglicherweise müssen Sie eine Char * Line verwenden; um den Raum inklusive zu bekommen. – khmarbaise

+3

Bitte ändern Sie '<<<' in '<<' und verwenden Sie '==' um auf Gleichheit zu prüfen. Diese Tippfehler lenken die Antworten ab. – Geoff

+0

Hinweis: Der Begriff Befehlszeile ist hier nicht wirklich relevant. Die Befehlszeile wird in Parameter konvertiert, die als argv-Parameter an main() übergeben werden. std :: cin liest von der Standardeingabe (die standardmäßig mit der Benutzertastatur verbunden ist). –

Antwort

35

Es überspringt standardmäßig alle Leerzeichen (Leerzeichen, Tabulatoren, neue Zeilen usw.). Sie können entweder sein Verhalten ändern oder einen etwas anderen Mechanismus verwenden. Um sein Verhalten zu ändern, verwenden Sie den Manipulator noskipws wie folgt:

cin >> noskipws >> a[i]; 

Aber, da Sie scheinen, wie Sie an den einzelnen Zeichen suchen möchten, würde ich vorschlagen mit get, wie diese vor Ihrer Schleife

Hinweis: get stoppt das Abrufen von Zeichen aus dem Stream, wenn entweder ein Zeilenvorschubzeichen (\n) oder nach n-1 Zeichen gefunden wird. Es stoppt früh, so dass es das Null-Zeichen (\0) an das Array anhängen kann. Sie können mehr über die istream Schnittstelle here lesen.

+1

was zum Teufel ist n? – dylnmc

+2

@dylnmc hast du den Beitrag gelesen? Sie hätten dann bemerkt, dass 'cin.get' 'n - 1' Zeichen aus dem Stream zurückgibt. – rcollyer

+0

ja; Es gibt keine – dylnmc

4

Verwenden cin.get() das nächste Zeichen zu lesen.

jedoch für dieses Problem ist es sehr ineffizient ein Zeichen zu einem Zeitpunkt zu lesen. verwenden sie die istream::read() statt.

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

Und == Gleichheit zu überprüfen verwenden, nicht =.

2

Mit dem Befehl cin's >> wird führende Leerzeichen gelöscht und die Eingabe am ersten nachgestellten Leerzeichen gestoppt. Um eine ganze Eingabezeile einschließlich Leerzeichen zu erfassen, versuchen Sie cin.getline(). Um ein Zeichen gleichzeitig zu verwenden, können Sie cin.get() verwenden.

+4

Beachten Sie, dass 'std :: isamream :: getline()' mit Zeichenpuffern arbeitet und somit das Risiko von Pufferüberläufen besteht. Besser verwenden Sie 'std :: getline (std :: iso- ram &, std :: string &, char c = '')' von ''. – sbi

+2

@sbi: Sollte nicht der letzte Parameter 'char c = '\ n'' sein? – tiftik

+1

Der Operator >> löscht den führenden Leerraum und liest das Zielobjekt unter Verwendung von Leerraum als Trennzeichen (so dass Standard-PODs das Ziel an der ersten Stelle nicht mehr lesen). (Es endet also nicht am ersten Leerraum). Beachten Sie auch, seien Sie sehr vorsichtig in der Verwendung des Begriffs "beenden" es hat eine sehr explizite Bedeutung, wenn über 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

Ich möchte char, aber nicht std :: string verwenden. Ich bin interessiert, mit char [] zu machen, was ich will. Trotzdem danke. – Narek

+0

Sie können immer noch über die Funktion c_str() oder über den Operator [], der in dieser Antwort angezeigt wird, zu den Zeichen gelangen. string bietet Ihnen auch eine Reihe nützlicher Funktionen: http://www.cplusplus.com/reference/string/string/ – Default

+1

@Narek: Ich hoffe, Sie haben einen sehr guten Grund, sich mit nackten 'char' Puffern auseinanderzusetzen und ich hoffe, du weißt mehr über sie, als du über Iostreams weißt. – sbi

0

Ich habe das gleiche Problem und ich habe gerade cin.getline(input,300); verwendet.

noskipws und cin.get() manchmal sind nicht einfach zu bedienen. Da Sie die richtige Größe Ihres Arrays haben, versuchen Sie es mit cin.getline(), die kein Zeichen interessiert und lesen Sie die ganze Zeile in der angegebenen Anzahl von Zeichen.

5

Zur Eingabe einer ganzen Zeile viele Räume, in denen Sie getline(cin,string_variable);

verwenden zB:

string input; 
getline(cin, input); 

Dieses Format die Räume alle im Satz einfängt, bis return wird

gedrückt
2

Ich dachte, ich Ich würde die Antwort teilen, die für mich funktioniert hat. Die vorherige Zeile endete in einer neuen Zeile, so dass die meisten dieser Antworten nicht selbst funktionierten. Dies tat:

Das ging davon aus, dass die Eingabe immer mindestens 2 Zeichen lang ist, was für meine Situation funktionierte. Sie können auch versuchen, es einfach mit der Zeichenfolge "\n" zu vergleichen.

1

Versuchen Sie, diese alle vier Art und Weise Eingang mit Platz zu nehmen :)

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