954,500 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Help with input

I want to take integer inputs separated by spaces and terminated by newline character. suppose the user will be inserting integers this way
123 566 789 45 34 8999 341 57 67 and then the user presses enter.
so the program will read all the integers when the user presses enter. The integers will be put into a linked list.

Note: 1. I dont want to do any parsing(first taking them as string and then separating the integers).
2. I could use an end condition like enter -1 to stop taking inputs, but dont like that idea either.

The thing is i m trying to make a electronic menu driven index, where there is a binary search tree and each treenode contains a word and a linked list of integers to hold the pages where the word appears in. I will first prompt the user for a word and then for the page numbers. But i need to read the inputs(page numbers) in a smart and convenient way. Let me know if u guys can help me with that.

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

try something like

vector<int> v;
string s;
while (cin<<s)
{
   if (s != "\n") v.push_back(atoi(s.c_str()));
}


replace \n with the corresponding value for your OS (or find some way to detect it and use the detected value).

jwenting
duckman
Team Colleague
8,392 posts since Nov 2004
Reputation Points: 1,662
Solved Threads: 337
 

To Jwenting,
ahem ahem,:rolleyes:
Thanx for that boss,BUT
i havent learned to use STL yet, and i dont plan to use them until i study them thoroughly and that's not gonna happen anytime soon. Do u have any non-STL solution to the problem?

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

hmm, I do believe in using the best tool for the job and that's the STL.

Another way would have you create a linked list of ints and read them into that instead of into a vector.
The STL solution probably does something similar internally, clearing you of all that messing around with pointers.

jwenting
duckman
Team Colleague
8,392 posts since Nov 2004
Reputation Points: 1,662
Solved Threads: 337
 

I want to take integer inputs separated by spaces and terminated by newline character. suppose the user will be inserting integers this way 123 566 789 45 34 8999 341 57 67 and then the user presses enter. so the program will read all the integers when the user presses enter. The integers will be put into a linked list.

Note: 1. I dont want to do any parsing(first taking them as string and then separating the integers).


These two requirements may be somewhat at odds. Input functions that are whitespace delimited may not distinguish between a space and a newline.

I suppose you could write your own input functions, but that seems like much more work than reading and parsing a line.

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 
Another way would have you create a linked list of ints and read them into that instead of into a vector.


I do have a linked list of integers and i have to insert the page numbers into it, but thats not the problem --the problem is about the end condition when it will stop inserting.

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 
These two requirements may be somewhat at odds. Input functions that are whitespace delimited may not distinguish between a space and a newline.

Well i got ur point. Can u suggest me any other technique to read in the page numbers easily one by one untill we meet some "end condition". What would be a smart end condition?

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 
Can u suggest me any other technique to read in the page numbers easily one by one untill we meet some "end condition". What would be a smart end condition?

EOF? :twisted:

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

"EOF"
>>I did try that too. But the problem is when i signal the EOF it stops taking input alright but doesnt take any other inputs after that. Say after inserting the page numbers the user might want to go back to the main menu and then from their might choose to search for a word in the dictionary, but using EOF as the end condition doesnt let u do that. So any other suggestions?

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

you're parsing numbers from the input.
I guess you're using atoi to turn the input into ints as you'll be reading it as char* ?
Check the docs for atoi, it will return 0 if the input is not recognised.
Pagenumber 0 is highly unusual, you could use that as a boundary condition (or a negative number might even be better).

So say you want the user to terminate the input by typing -1. atoi("-1") will return -1 which will flag you that the user is done inputting text.

jwenting
duckman
Team Colleague
8,392 posts since Nov 2004
Reputation Points: 1,662
Solved Threads: 337
 
"EOF" >>I did try that too. But the problem is when i signal the EOF it stops taking input alright but doesnt take any other inputs after that. Say after inserting the page numbers the user might want to go back to the main menu and then from their might choose to search for a word in the dictionary, but using EOF as the end condition doesnt let u do that. So any other suggestions?

Narue will likely mention something I've overlooked with this, such asclearerr or something, but...

#include <stdio.h>

int main ( void )
{
   int i, number;
   for ( i = 0; i < 3; ++i )
   {
      fputs ( "page number(s) ? ", stdout );
      fflush ( stdout );
      while ( scanf ( "%d", &number ) == 1 )
      {
         printf ( "number = %d\n", number );
      }
      <strong>rewind ( stdin );</strong>
   }
   return 0;
}

/* my output
page number(s) ? 12 23 34 45^Z
number = 12
number = 23
number = 34
number = 45
page number(s) ? 78 89 90^Z
number = 78
number = 89
number = 90
page number(s) ? 1 2 3^Z
number = 1
number = 2
number = 3
*/


But I find this kinda clunky anyway.

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

Hey everyone,

You all are high level programmers..and i'm really just a begginer in front

of you all but still if i might ask Asif why dont you use the function

which scan keys, as they do in programming games.

char ch;
ch=getch();
if(ch==13)
{....}
13 is the ascii code for Enter Key..

Is it possible this way?

Neo99
Newbie Poster
5 posts since Nov 2004
Reputation Points: 10
Solved Threads: 0
 

You all are high level programmers..and i'm really just a begginer in front

of you all but still if i might ask Asif why dont you use the function

which scan keys, as they do in programming games.

I did mention this already.I suppose you could write your own input functions, but that seems like much more work than reading and parsing a line. char ch;
ch=getch();
if(ch==13)
{....}
13 is the ascii code for Enter Key..Ew. You're going to have a lot of fun unlearning bad habits.

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

well instead of if(ch==13)
while(ch!=13)
{all the inputting inside}
what do u think..

Neo99
Newbie Poster
5 posts since Nov 2004
Reputation Points: 10
Solved Threads: 0
 

>what do u think..

I think it would be a worthwhile exercise, then you'd know why I said, "but that seems like much more work than reading and parsing a line."

[Don't forget about backspaces!]

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

getch() is platform specific, it's DOS/Win only.
We try to keep code as much platform independent as possible for as long as possible.
Besides, getch() gets a single character and the problem is about reading and parsing a string.

jwenting
duckman
Team Colleague
8,392 posts since Nov 2004
Reputation Points: 1,662
Solved Threads: 337
 

This is just an example, but demonstrates reading in and outputing to( could be file or whatever) the screen. Enter the numbers you want seperated by a space. when you are finished hit enter then crtl + z and enter key again to output to the screen.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
	// create a string vector
	// inialized by all the words from standard input
	vector<string> v((istream_iterator<string>(cin)),
		             istream_iterator<string>());

	//sort elements
	sort( v.begin(), v.end() );

	//print all elements ignoring subsquent duplicates
	unique_copy( v.begin(), v.end(),
		         ostream_iterator<string>(cout, "\n") );


	return 0;
}
big146
Newbie Poster
18 posts since Jul 2004
Reputation Points: 14
Solved Threads: 0
 

why is everyone so much into STL?
Did i not explain why i dont want to use STL? Cos i m not into it yet. My knowledge on C++ is limited. Well what the heck, i have done it by parsing -- seems like that's the best way (without STL ofcourse). The thing is i encounter this type of problems so often that i wanted to know if there were any easy alternatives. Becos my knwoledge on C++ is limited i thought u guys would suggest something i did not know but was very simple to use. And in return i get codes that are either STL or uses advance techniques that are no easier than the parsing(using getchar() -- platform independent:)). So back to old dog's trick. Thanx for the help though.

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You