How to Input Variables Using Cin Without Creating a New Line

How do I input variables using cin without creating a new line?

You can't use cin or any other standard input for this. But it is certainly possible to get the effect you are going for. I see you're on Windows using Visual Studio, so you can use, for example, _getch. Here's an example that reads until the next whitespace and stores the result in a string.

#include <conio.h> // for _getch

std::string get_word()
{
std::string word;
char c = _getch();
while (!std::isspace(c))
{
word.push_back(c);
std::cout << c;
c = _getch();
}
std::cout << c;
return word;
}

It's not very good. For example, it doesn't handle non printing character input very well. But it should give you an idea of what you need to do. You might also be interested in the Windows API keyboard functions.

If you want a wider audience, you will want to look into some cross-platform libraries, like SFML or SDL.

how to get a variable without going to next line

You can't do what you want with cin (or cin alone). C++ doesn't know that there's a terminal with a cursor (you could be typing on a line printer terminal with no ability to go back).

The standard response for when you need cursor control is to use ncurses (https://www.gnu.org/software/ncurses/) or a package like that. If you have only one type of terminal (typically a VT-100/ANSI terminal) you can output a control sequence to move the cursor. See http://www.termsys.demon.co.uk/vtansi.htm for more details.

Directly capturing cin to a function as parameter without a temporary variable - C++

You can easily define a wrapper function to do this.

template<class T>
T get(std::istream& is){
T result;
is >> result;
return result;
}

Any decent compiler will use NRVO to eliminate the copy.

You can use it like this

f(get<int>(std::cin));

Make sure not to use it multiple times in one statement though. The order of the stream operations is unspecified if you do something like this.

f(get<int>(std::cin),get<int>(std::cin));

You could get the two ints in either order.

In c++, my program automatically goes to the next CIN prompt without letting the user add input


cin >> name;

Takes the input only upto space. Therefore if you print the variable name you will get Daniel. And if you print the variable address you will get Benson. So as far as the program is concerned it has taken in two strings as input.

A proof of the above statements by printing the variables after input.

You might want to use cin.getline() for taking space separated strings as input.

C++ Line break entered as input automatically if you give a cin an unexpected input inside loop

When the input given to std::cin cannot be converted to the type of the variable it will write, it enters an error state, which can be queried with cin.fail() (or synonyms such as !cin). If it returns true (meaning that the failbit of the stream is set), then it means that the conversion failed. While in this fail state, cin will refuse to read any data until the failbit is cleared.

In the lines where you read the numbers from the user, you should use a loop that checks the fail state of the stream, if it returns false, then continue normal execution, otherwise, call std::cin.clear() to clear the failbit so cincan continue reading as usual.

Keep in mind that the faulty input will still be in the stream (i.e. the 'e' you entered will still be there, so if that input is read again as a int, it will fail again), so call std::cin.ignore(<A big number like 256>,'\n') to skip over the bad/faulty input, while prompting the user for correct input (The number passed to ignore is the number of characters it should skip). The '\n' argument means all the characters in the stream are ignored until the next line, without it the user would have to enter the 256 characters.

Cin multiple times on the same line

Your issue is with cin >> value which usually requires the User to press ENTER to cause the processing of the input.

The ENTER is echoed back, causing a new blank line.

As others have said, you could use std::getline() to read a lot of data before the ENTER is pressed.

The question is, is a blank line echoed really worth the effort to avoid?



Related Topics



Leave a reply



Submit