Solved

Testing strings?

Posted on 2004-09-08
11
188 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
 

Author Comment

by:AntoniRyszard656
Comment Utility
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
Comment Utility

Could I use getchar()?
0
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 
LVL 15

Expert Comment

by:efn
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
> 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
Comment Utility
Thanks I will try this, I am using Dev-C++ which I believe uses the latest compile.

0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

728 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now