-
January 6th, 2013, 08:12 AM
#1
User input
I have console aplication, user is typing command through console and I should do some action according those inputs. One command is on one line only.
for example cp is a command which has 4 parameters, between every 2 parameters can be many whitespaces they doesnt matter, so valid command is e.g.-> cp 4 5 6 9 thats valid.
valid command is new line too, it is not supposed to do anything just a know new line
valid command is, any number of white spaces and new line, it does the same thing as new line. But here is my problem, in my code where I am spliting strings according whitespaces it does SIGSEV and I dont why.
Code:
void io::start(std::istream& in, std::ostream& out, std::ostream& err){
bool end = true;
out << ">>>";
while(end){
vector<string> tokens;
string input;
getline(in,input); // read the line from console
if(input.size()==0) //if input was just newLine than i add a string zero
input += '\0';
stringstream ss(input); // Insert the string into a stream
string buf;
if(!has_only_spaces(input)){ //has_only white spaces is method which tries to not let string only with whitespaces to be splitted, but sigsev occurs in it too
while (ss >> buf){ //SIGSEV here, if theres no if around it, spliting the string here
tokens.push_back(buf);
}
}
}
bool has_only_spaces(const std::string &str)
{
for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
{
char c = *it;
if(!isspace(c)){ //sigsev here on last char if string is " " if string is " a" everything is fine
return false;
}
}
return true;
}
So i would like to know wheres the problem and how to fix it, or how can read user input effectively than I do now.
-
January 6th, 2013, 12:24 PM
#2
Re: User input
Originally Posted by fleg14
I have console aplication, user is typing command through console and I should do some action according those inputs. One command is on one line only.
for example cp is a command which has 4 parameters, between every 2 parameters can be many whitespaces they doesnt matter, so valid command is e.g.-> cp 4 5 6 9 thats valid.
First, we don't know what state your program is in when you call this function, whether you've already corrupted memory when you call this function, whether "io" is a valid object, etc.
Let's get a full program, and then show us what is the input to make it crash:
Code:
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <cctype>
#include <algorithm>
#include <iostream>
using namespace std;
bool has_only_spaces(const std::string &str);
void start(std::istream& in, std::ostream& out)
{
bool end = true;
out << ">>>";
while (end)
{
vector<string> tokens;
string input;
getline(in,input);
if (input.empty())
input += '\0';
stringstream ss(input);
string buf;
if (!has_only_spaces(input))
{
while (ss >> buf)
tokens.push_back(buf);
}
}
}
bool has_only_spaces(const std::string &str)
{
return std::count_if(str.begin(), str.end(), isspace) == str.size();
}
int main()
{
start(cin, cout);
}
That full program is basically your code, except for the has_only_spaces which calls count_if() (no loop required). Take the program above, compile and run it. Tell us if this program crashes, and what input you used to crash the program.
Regards,
Paul McKenzie
Last edited by Paul McKenzie; January 6th, 2013 at 12:28 PM.
-
January 6th, 2013, 05:37 PM
#3
Re: User input
Thanks for help.
i am getting C:\Users\Ivan\qqq\main.cpp||In function 'bool has_only_spaces(const std::string&)':|
C:\Users\Ivan\qqq\main.cpp|39|error: no matching function for call to 'count_if(__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded function type>)'|
i dont know why i cant use count_if, i am using codeblocks IDE
Sorry for trouble, i am novice in c++, I am used to java and C#, but C++ makes me headaches as hell. Google havent helped me here :/
-
January 6th, 2013, 07:00 PM
#4
Re: User input
Try this revised version:
Code:
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <cctype>
#include <algorithm>
#include <iostream>
using namespace std;
bool has_only_spaces(const std::string &str);
void start(std::istream& in, std::ostream& out)
{
bool end = true;
out << ">>>";
while (end)
{
vector<string> tokens;
string input;
getline(in,input);
if (input.empty())
input += '\0';
stringstream ss(input);
string buf;
if (!has_only_spaces(input))
{
while (ss >> buf)
tokens.push_back(buf);
}
}
}
bool IsSpace(char ch)
{
return isspace(ch)?true:false;
}
bool has_only_spaces(const std::string &str)
{
return std::count_if(str.begin(), str.end(), IsSpace) == str.size();
}
int main()
{
start(cin, cout);
}
Regards,
Paul McKenzie
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|