c++ - para - ¿Por qué hay dos funciones getline() diferentes(si es que las hay)?
getline para string (6)
Es un problema común de diseño de interfaz. cin.getline()
es una forma natural de realizar la solicitud, pero para evitar que el código de transmisión dependa de <string>
, no se puede ofrecer la función cin.getline(std::string&)
. La línea libre getline(cin, s)
se puede agregar más tarde una vez que se hayan puesto en práctica las cadenas. No es un problema para char*
ya que no hay nada que #include
: de todos modos, parte del lenguaje.
De alguna manera, es bueno cuando los idiomas permiten que el código posterior agregue más funciones a las clases existentes (por ejemplo, Ruby), pero de otras maneras la deslocalización afecta y, por lo tanto, compromete la capacidad de mantenimiento. Luego, por supuesto, existe el popular argumento de las funciones mínimas de miembro y muchas funciones independientes: personalmente creo que no debería llevarse a cabo para hacer que la interfaz sea menos intuitiva y expresiva, sino que cada una de ellas es propia.
Cada vez que hago un fragmento rápido de la línea de código C ++
std::string s;
cin >> s;
Me maldigo a mí mismo porque olvidé que se detiene en el espacio en blanco en lugar de obtener una línea completa.
Luego, al recordar getline
, siempre me confunden las dos variedades:
std::string s;
getline (std::cin, s);
y:
char cs[256];
std::cin.getline (cs, sizeof (cs));
¿Existe realmente una diferencia entre estos dos distintos del tipo de datos?
Me parece que la forma en C ++ debería ser la primera. ¿Bajo qué circunstancias usaría este último, dado que probablemente debería usar cadenas reales en lugar de matrices de caracteres terminadas en nulo de todos modos?
Y, dado que la entrada debería ser realmente el ámbito de los flujos de entrada, ¿por qué no es la primera parte de istream
?
La función miembro cin.getline () funciona con cadenas C (es decir, matrices de char), mientras que la función gratuita std :: getline () funciona con cadenas C ++ (es decir, std :: string.) No debe utilizar cadenas C en absoluto cuando aprendiendo C ++, lo que significa que no debes usar cin.getline ().
std :: getline () lee una cadena desde un flujo de entrada hasta un delimitador. El delimitador por defecto es ''/ n'' y no hay razón para especificar ese tercer argumento si solo va a pasar el carácter de nueva línea. No sabe ni le importa lo que está contenido en esa cadena, aparte de verificar el delimitador. Si desea intentar analizar esa cadena como un entero o un valor de punto flotante, puede hacerlo después de leer la secuencia, pero ese no es el trabajo de std :: getline (). Sólo lee una cadena.
La función global getline() funciona con C ++ std::string objetos.
Los métodos istream::getline() funcionan con cadenas C "clásicas" (punteros a char
).
La variante getline
dentro de la biblioteca iostreams no admite cadenas como destinos, por lo que la biblioteca de cadenas define una variante que sí lo hace.
Sí, la forma moderna de C ++ es usar la función libre e ingresar una cadena estándar ::.
Pero IOStream tiene una historia mucho más larga (la versión estándar es al menos la tercera encarnación del mismo diseño) que std :: string y esa historia explica por qué las cosas son como son.
(El miembro de getline tiene la ventaja de que no implica una asignación dinámica; esa característica puede ser útil en el momento pero probablemente no sería suficiente para justificarla en un diseño desde cero).
Tenga en cuenta que la biblioteca estándar se compone de 3 partes (principales): IOStream, String y STL, además de algunas tiradas en golosinas y los encabezados en C.
No veo nada extraño en tener esas partes acopladas de manera holgada (aunque me gustaría que no fuera el caso).
Otras incongruencias incluyen: std::string::length
vs std::string::size
, la última se agregó para la compatibilidad de la interfaz con la STL y la primera se conservó para la compatibilidad con el código anterior.