Improve company productivity with a Business Account.Sign Up

x
?
Solved

Testing strings?

Posted on 2004-09-08
11
Medium Priority
?
231 Views
Last Modified: 2010-04-01
Hello,

I was trying to test if the far right character in a string equalled #.

And thought it would be a good idea to trim the right of string to move any spaces.

I found this code on the web:

string rtrim(const string &str){
   int idx = str.find_last_not_of("\t ");
   
   if(idx != string::npos)  
   return str.substr(0,idx+1);
   
   return str;  
}

But, when I tested the string using:

if(string.length()-1 == '#'){
//some action
}

All tested strings seemed to be regarded as if the last character equalled #, even when the # was at the start of the string rather than on the right.

Any thoughts?
0
Comment
Question by:AntoniRyszard656
  • 6
  • 2
  • 2
  • +1
11 Comments
 
LVL 13

Expert Comment

by:SteH
ID: 12007206
Use the indexing operator to get a char of a string.

if(str[str.length()-1] == '#'){
//some action
}
0
 
LVL 13

Expert Comment

by:SteH
ID: 12007233
Your comparison was
str.length () -1 == (int) ('#') = 35
so the if part would only be executed ifthe length of the string was 36 (-1 = 35)
0
 

Author Comment

by:AntoniRyszard656
ID: 12007967
Thanks

Would you recommend using this method to remove the empty spaces from the right of a string or is there some better approach?

string rtrim(const string &str){
   int idx = str.find_last_not_of("\t ");
   
   if(idx != string::npos)  
   return str.substr(0,idx+1);
   
   return str;  
}
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 

Author Comment

by:AntoniRyszard656
ID: 12008595
Hello,

I tried using the indexing operator, in this example. But found when I entered:

# test

The if statement was entered, and "Working" displayed. I was hoping only when the string ended with # would the program enter the if statement.

Could anyone see the problem?

Thanks

#include <iostream>
#include <conio.h>
 
 using namespace std;
       
 int main(int argc, char *argv[]){  
    string input;      
   
    while(input!="exit"){
       cout << "Enter text: ";
       cin >> input;            
                         
       if(input[input.length()-1] == '#'){
          cout << endl<< "Working";
          getch();
       }
       
       system("cls");
    }
     
    return 0;
}
0
 

Author Comment

by:AntoniRyszard656
ID: 12008665

Could I use getchar()?
0
 
LVL 15

Expert Comment

by:efn
ID: 12012621
When you read into a string from a stream, you get a word, not a line.  In your test case, because there was a space after the '#', the string was set to the first word only:  "#".  So the program correctly reported that the last character of the string was '#'.

You could try the getline function to read a whole line into the string.

getline(cin, input);

This should work, but when I tried it, I had to hit Enter twice to get the program to accept my input.

--efn
0
 

Author Comment

by:AntoniRyszard656
ID: 12014585
Thanks

Do you think changing the string input to a char * could make the end character easier to test?
0
 
LVL 12

Accepted Solution

by:
stefan73 earned 120 total points
ID: 12015184
Hi AntoniRyszard656,
> Do you think changing the string input to a char * could make the end
> character easier to test?

You'll get "C'ish" code. Sure, you can do:

bool endsWithSharp(char* s){
    if(*s && s[strlen(s)-1] == '#')
        return true;
    else
        return false;
}

...but that's not really C++ :-)

Cheers!

Stefan
0
 

Author Comment

by:AntoniRyszard656
ID: 12015636
Thanks,

Could you also demonstrate the alternative use of getline.

And is there any way to stop the need to press Enter twice, that (efn) mentioned?
0
 
LVL 15

Expert Comment

by:efn
ID: 12023067
> And is there any way to stop the need to press Enter twice, that (efn) mentioned?

Yes, this is a known bug in the Microsoft Visual C++ 6.0 library.  If you don't have that compiler, you may not have the bug.  The fix is here:

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q240/0/15.ASP&NoWebContent=1

Courtesy of DanRollins in this PAQ:

http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20180499.html

--efn
0
 

Author Comment

by:AntoniRyszard656
ID: 12025969
Thanks I will try this, I am using Dev-C++ which I believe uses the latest compile.

0

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
Article by: evilrix
Looking for a way to avoid searching through large data sets for data that doesn't exist? A Bloom Filter might be what you need. This data structure is a probabilistic filter that allows you to avoid unnecessary searches when you know the data defin…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

608 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question