2010-09-16 32 views

Respuesta

16

cin no es una declaración, es una variable que hace referencia a la corriente de entrada estándar. Entonces, la coincidencia más cercana en C es en realidad stdin.

Si usted tiene un C++ declaración como:

std::string strvar; 
std::cin >> strvar; 

una cosa similar en C sería el uso de cualquiera de una amplia variedad de funciones de entrada:

char strvar[100]; 
fgets (strvar, 100, stdin); 

Ver an earlier answer Hoy hice una pregunta sobre una forma de hacer entradas de línea y analizar de forma segura. Básicamente está ingresando una línea con fgets (aprovechando su protección de desbordamiento del búfer) y luego usando sscanf para escanear la línea de manera segura.

Cosas como gets()y ciertas variaciones de scanf() (como cuerdas sin límites) se deben evitar como la peste, ya que son fácilmente susceptibles de amortiguar el exceso de carreras. Están bien para jugar, pero cuanto antes aprendas a evitarlos, más robusto será tu código.

+4

Creo que sería justo interpretar que la pregunta significa 'equivalente a un enunciado usando cin' – sje397

9

Probablemente desee scanf.

Un ejemplo del enlace: sin embargo

int i, n; float x; char name[50]; 
n = scanf("%d%f%s", &i, &x, name); 

Nota (como se menciona en los comentarios) que scanf es propenso a buffer overrun, y hay un montón de otras funciones de entrada se puede utilizar (ver stdio.h).

+2

Si _debes usar 'scanf', al menos úsalo de una manera que no desborde el búfer :-) Consulta http://stackoverflow.com/questions/3723044/get-scanf-to-quit-when -it-read-a-newline/3723071 # 3723071 para una mejor manera. – paxdiablo

+1

No recomendamos usar 'scanf'. http://c-faq.com/stdio/scanfprobs.html – jamesdlin

+3

Creo que mi advertencia es lo suficientemente clara.El OP es obviamente bastante nuevo para C, y scanf proporciona el comienzo perfecto para aprender sobre la entrada de línea de comandos sin tener que preocuparse por complejidades adicionales. Estoy seguro de que volverá a encontrar la idea de desbordamiento del búfer antes de que se escriba cualquier código de producción. Los usuarios más experimentados que leen la pregunta deberían prestar atención a la advertencia. – sje397

1

En C++, cin es la corriente de entrada stdin. No hay flujo de entrada en C, pero hay un objeto de archivo, llamado stdin. Puede leer de él usando una gran cantidad de maneras, pero aquí hay un ejemplo de cplusplus.com:

/* fgets example */ 
#include <stdio.h> 

int main() 
{ 
    char buffer[256]; 
    printf ("Insert your full address: "); 
    if (fgets(buffer, 256, stdin) != NULL) { 
    printf ("Your address is: %s\n", buffer); 
    } 
    else { 
    printf ("Error reading from stdin!\n"); 
    } 
    return 0; 
} 

ACTUALIZACIÓN

he cambiado a utilizar fgets, que es mucho más simple ya que tienes preocuparse por el tamaño de su memoria intermedia. Si también desea analizar la entrada use scanf, pero , asegúrese de usar el atributo de ancho.

+2

-1 para incluso * mencionar * 'obtiene'. Es demasiado propenso a saturar excesos, y nunca, nunca, * nunca * debe usarse en un código nuevo. – cHao

+0

Bien, lo arreglaré. ¿Crees que scanf es mucho mejor? : P –

+1

Personalmente no soy fanático de eso. 'fgets' hace un trabajo similar a' gets', sin embargo, y le permite especificar la longitud del buffer. La única pega es que iirc mantiene la nueva línea en lugar de mordisquearla. – cHao

2

No hay equivalente cercano a cin en C. C++ es un lenguaje orientado a objeto y cin utiliza muchas de sus características (la orientación a objetos, plantillas, sobrecarga de operadores) que no están disponibles en C.

Sin embargo, Puede leer cosas en C usando la biblioteca estándar C, puede ver la parte relevante aquí (cstdio reference).

+1

+1 para proporcionar una referencia vinculada en lugar de mencionar/ilustrar una sola función como si esa fuera la única opción C. @Anteater: es el encabezado para usar las rutinas de E/S estilo C dentro de los programas C++, si estás escribiendo un programa C simplemente #include

+0

Tienes razón, estoy tan acostumbrado a C++ que olvidé eso en C los nombres de los encabezados son diferentes. – jbernadas

Cuestiones relacionadas