2010-05-04 22 views
24

Digamos que tenemos un código:Cómo usar Cin Space en 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; 
} 

Cómo Cin un símbolo del espacio de la entrada estándar? Si escribe espacio, el programa ignora! :( ¿Hay alguna combinación de símbolos (por ejemplo, '\ s' o algo así) que significa "espacio" que puedo usar de la entrada estándar para mi código?

+0

Por lo que yo puedo recordar el espacio (espacio en blanco?) Se utiliza para separar las diferentes entradas. Puede ser que necesite usar una línea de caracteres *; para obtener el espacio inclusivo. – khmarbaise

+3

Cambie '<<<' a '<<' y use '==' para probar la igualdad. Estos errores tipográficos están distrayendo las respuestas. – Geoff

+0

Nota: El término línea de comando no es realmente relevante aquí. La línea de comando se convierte en parámetros pasados ​​a main() como los parámetros argv. std :: cin lee de la entrada estándar (que por defecto está conectada al teclado del usuario). –

Respuesta

35

Omite todos los espacios en blanco (espacios, pestañas, líneas nuevas, etc.) de forma predeterminada. Puede cambiar su comportamiento o utilizar un mecanismo ligeramente diferente. Para cambiar su comportamiento, utilice el manipulador noskipws, de la siguiente manera:

cin >> noskipws >> a[i]; 

Pero, ya que parece como si desea ver los caracteres individuales, sugeriría el uso de get, como esto antes de su bucle

cin.get(a, n); 

Nota: get dejará de recuperar caracteres de la secuencia si encuentra un carácter de nueva línea (\n) o después de caracteres n-1. Se detiene antes de tiempo para que pueda agregar el carácter nulo (\0) a la matriz. Puede leer más sobre la interfaz istreamhere.

+1

¿Qué diablos es n? – dylnmc

+2

@dylnmc ¿leíste la publicación? Habría notado, entonces, que afirmo 'cin.get' devuelve' n - 1' caracteres de la secuencia. – rcollyer

+0

sí; no hay n – dylnmc

4

Uso cin.get() a leer el siguiente carácter.

sin embargo, para este problema, que es muy ineficiente para leer un carácter a la vez. utilice el istream::read() lugar.

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

y el uso == para comprobar la igualdad, no =.

2

Al usar el operador cin >>, se eliminarán los espacios en blanco iniciales y se detendrá la entrada en el primer espacio en blanco al final. Para tomar una línea completa de entrada, incluidos los espacios, intente cin.getline(). Para tomar un personaje a la vez, puedes usar cin.get().

+4

Tenga en cuenta que 'std :: istream :: getline()' trata con los búferes de caracteres y, por lo tanto, conlleva el riesgo de desbordamientos de búfer. Mejor uso 'std :: getline (std :: istream &, std :: string &, char c = '')' from ''. – sbi

+2

@sbi: ¿No debería ser el último parámetro 'char c = '\ n''? – tiftik

+1

El operador >> soltará el espacio en blanco inicial y leerá el objeto objetivo utilizando un espacio en blanco como delimitador (por lo que para los POD estándar dejará de leer el objetivo en el primer espacio). (Por lo tanto, no 'termina' en el primer espacio en blanco). También tenga en cuenta, tenga mucho cuidado en el uso del término 'terminar', tiene un significado muy explícito cuando se habla de 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

Quiero usar char, pero no std :: string. Estoy interesado en hacer lo que quiero con Char []. Gracias de todos modos. – Narek

+0

puede acceder a los caracteres a través de la función c_str() o del operador [] que se muestra en esta respuesta. string también le proporcionará un conjunto de útiles funciones: http://www.cplusplus.com/reference/string/string/ – Default

+1

@Narek: espero que tenga una muy buena razón para querer ocuparse de los búfers 'char' desnudos y espero que sepas más sobre ellos de lo que sabes sobre iostreams. – sbi

0

Tengo el mismo problema y acabo de usar cin.getline(input,300);.

noskipws y cin.get() a veces no son fáciles de usar. Dado que tienes el tamaño correcto de tu matriz, prueba usando cin.getline(), que no se preocupa por ningún carácter y lee toda la línea en el recuento de caracteres especificado.

5

A la entrada de una línea completa que contiene gran cantidad de espacios que se puede utilizar getline(cin,string_variable);

por ejemplo:

string input; 
getline(cin, input); 

Este formato de captura todos los espacios en la frase hasta el return se presiona

2

pensé que Compartiría la respuesta que funcionó para mí. La línea anterior terminó en una nueva línea, por lo que la mayoría de estas respuestas por sí mismas no funcionaron. Esto hizo:

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

Eso suponía que la entrada siempre tiene al menos 2 caracteres de longitud, lo que funcionó para mi situación. También puede intentar simplemente comparándolo con la cadena "\n".

1

probar este los cuatro manera de tomar la entrada con el espacio :)

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