resueltos - funciones de cadenas de caracteres en c++
¿Cómo uso cin entre cadenas en C++? (5)
Soy bastante nuevo en C ++ y he estado aprendiendo cosas como esta:
cout << "My age is: ";
cin >> age;
Jugando con cin, he encontrado un obstáculo.
Digamos que quería escribir "Tengo x años!".
"x" siendo cin >> edad;
Escribo el código así.
cout << "I am ";
cin >> age;
cout << "years old!";
El obstáculo es que esto produce un salto de línea.
No quiero que se rompa la línea.
¿Cómo puedo tener toda esta estancia en una línea?
No puedes hacer lo que quieres en C ++ puro. Puedes hacer lo que otros sugieran y reimprimir la línea:
std::cout << "I am " << age << " years old!/n"
O puede usar una función específica del sistema operativo para borrar la salida de la consola. Lea acerca de esto aquí .
Por ejemplo, podrías usar system("cls");
para Windows, para borrar la consola después de preguntarle al usuario su edad.
#include <stdlib.h>
int main(int argc, char* argv[]) {
unsigned int age;
std::cout << "My age is: "
std::cin >> age;
system("cls");
std::cout << "I am " << age << " years old!/n"
...
}
Rendimientos:
C:>AgeProgram.exe I am 10 years old
Supongo que realmente desea que la entrada esté en línea con la salida final. De lo contrario, la solución es trivial: primero lea el valor y luego imprímalo, por ejemplo:
std::cout << "how old are you? ";
std::cin >> x;
std::cout << "I am " << x << " years old/n";
Tratar con la entrada que está en línea con la salida es un poco más complicado. El problema aquí es que el manejo de la consola es hecho por el sistema y no por el idioma. Como resultado, es necesario esperar una nueva línea al ingresar los datos. La nueva línea será manejada por la consola y creará un salto de línea. Para deshabilitar este comportamiento, es necesario evitar confiando en el comportamiento de la consola. No hay una forma estándar de C ++ de hacerlo.
No sé cómo lidiar con los controles de consola en Windows: soy principalmente un programador de UNIX. En un sistema UNIX, utilizaría tcgetattr()
y tcsetattr()
para configurar el modo de entrada como no canónico (es decir, para borrar el bit ICANON
). El descriptor de archivo requerido es simplemente el de la entrada estándar, es decir, 0
.
Una vez que la consola está utilizando el modo no canónico, todas las pulsaciones de teclas se reenvían inmediatamente a la aplicación y no se hace eco en la pantalla. Como resultado, la función de lectura tendrá que hacer eco de los caracteres individuales y luego reenviarlos a una función de análisis. La forma más sencilla de hacerlo es crear un búfer de flujo de filtrado que haga el eco necesario para std::cin
a std::cout
mientras reenvía el carácter. Sin embargo, juntar todo eso es un poco de trabajo ...
Al cocinar una demostración, noté que también necesitaba lidiar con el eco (para evitar una nueva línea cuando el usuario usa la tecla enter). También es importante restablecer los indicadores de la consola, ya que algunos de ellos permanecen modificados incluso después de que finalice el programa. Una implementación que pone los bits juntos pero que aún carece de manejo de errores podría verse así:
#include <iostream>
#include <ctype.h>
#include <termios.h>
struct non_canon_buf
: std::streambuf {
char buffer;
non_canon_buf() {
termios flags = {};
tcgetattr(0, &flags);
flags.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &flags);
}
~non_canon_buf() {
termios flags = {};
tcgetattr(0, &flags);
flags.c_lflag |= ICANON | ECHO;
tcsetattr(0, TCSANOW, &flags);
}
int underflow() {
if (std::cin.get(buffer)) {
this->setg(&buffer, &buffer, &buffer + 1);
if (!std::isspace(static_cast<unsigned char>(buffer))) {
std::cout << buffer << std::flush;
}
return std::char_traits<char>::to_int_type(buffer);
}
return std::char_traits<char>::eof();
}
};
int main()
{
non_canon_buf sbuf;
std::istream in(&sbuf);
std::cout << "I am ";
int age = 0;
in >> age;
std::cout << " years old/n";
if (!in) {
std::cout << "ERROR: failed to enter a valid age!/n";
}
}
puedes hacer así
int user_age;
std:cout<<"Enter Your Age:" //Ask user for age
std::cin >>user_age; //Read user input
std::cout<<"I am"<<user_age<<"years old!"<< std::endl; //finlly display the value
cin
lee la entrada después de que se ingresa una nueva línea en la consola.
Por lo tanto, la única forma en que puede hacerlo continuamente es pedirle al usuario su edad y luego proceder a escribirlo.
p.ej:
std::cout << "Enter your age> ";
std::cin >> age;
std::cout << "I am " << age << " years old" << std::endl;
unsigned int age;
std::cin >> age;
std::cout << "I am " << age << " years old!" << std::endl;