Solved

Testing strings?

Posted on 2004-09-08
11
204 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
ScreenConnect 6.0 Free Trial

Discover new time-saving features in one game-changing release, ScreenConnect 6.0, based on partner feedback. New features include a redesigned UI, app configurations and chat acknowledgement to improve customer engagement!

 

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 30 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

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

809 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