Hi,
For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str())
and
s1.compare(s2)
can someone explain what these functions do? It seems that strcmp
gives the "right" (i.e.wysiwyg) answer while compare() does not. 10 14447 lc****@yahoo.com wrote: For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
'compare' takes into consideration _all_ contents, including any number
of the "terminating" null characters. 'c_str()' effectively truncates
the contents at the first null character.
Try comparing the "size"s of s1 and s2.
V
--
Please remove capital As from my address when replying by mail lc****@yahoo.com wrote: Hi,
For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
Post a complete program that demonstrates the problem. The one I'll
show below does NOT exhibit that behavior:
#include <string.h>
#include <string>
int main(void)
{
using namespace std; // quick and dirty
string s1 = "foo";
string s2 = "bar";
if (!strcmp(s1.c_str(), s2.c_str()))
cout << "match\n";
else
cout << "no match\n";
if (!s1.compare(s2))
cout << "match\n";
else
cout << "no match\n";
string s3 = "foo";
string s4 = "foo";
if (!strcmp(s3.c_str(), s4.c_str()))
cout << "match\n";
else
cout << "no match\n";
if (!s3.compare(s4))
cout << "match\n";
else
cout << "no match\n";
return 0;
}
Results:
no match
no match
match
match
Brian
--
Please quote enough of the previous message for context. To do so from
Google, click "show options" and use the Reply shown in the expanded
header.
Default User wrote: lc****@yahoo.com wrote:
Hi,
For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
Post a complete program that demonstrates the problem. The one I'll show below does NOT exhibit that behavior:
#include <string.h> #include <string>
int main(void) { using namespace std; // quick and dirty
string s1 = "foo"; string s2 = "bar";
if (!strcmp(s1.c_str(), s2.c_str())) cout << "match\n"; else cout << "no match\n";
if (!s1.compare(s2)) cout << "match\n"; else cout << "no match\n";
string s3 = "foo"; string s4 = "foo";
Add
s3.append(5, 0); // add 5 zeros at the end
and see what happens. if (!strcmp(s3.c_str(), s4.c_str())) cout << "match\n"; else cout << "no match\n";
if (!s3.compare(s4)) cout << "match\n"; else cout << "no match\n";
return 0; }
Results:
no match no match match match Brian
V
--
Please remove capital As from my address when replying by mail
Victor Bazarov wrote: Default User wrote:
[snip code]
Add
s3.append(5, 0); // add 5 zeros at the end
and see what happens.
I know what would happen. Does the OP? As I said, without seeing the
code he's running, there's no way to tell. Mine was an example of usage
that got different results than he reported. He should use that to
compare with his and see what the differences are.
It could be he's not using one of the routines correctly. It could be
that his strings aren't really equal, perhaps for the reason you
mention. We can't tell.
The ball's in his court. There's really no point in further discussion
without a complete program to analyze.
Victor Bazarov wrote: lc****@yahoo.com wrote: For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
'compare' takes into consideration _all_ contents, including any number of the "terminating" null characters. 'c_str()' effectively truncates the contents at the first null character.
Nitpick: it's not c_str() truncating the strings, it's strcmp() only reading
until it finds the first null character.
Best
Kai-Uwe Bux
Kai-Uwe Bux wrote: Victor Bazarov wrote:
lc****@yahoo.com wrote:
For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
'compare' takes into consideration _all_ contents, including any number of the "terminating" null characters. 'c_str()' effectively truncates the contents at the first null character.
Nitpick: it's not c_str() truncating the strings, it's strcmp() only reading until it finds the first null character.
Where is the guarantee that the pointer 'c_str()' returns in _not_ to some
temporary buffer that only contains characters up to and including the
first null char? Note that if the 'data()' of the std::string does _not_
contain a null char, the string _has_ to create a temporary buffer. So,
it is _most_ likely that the temporary buffer is created. And if it is,
there is no sense for the 'string' to copy anything there beyond the first
null character. Hence, the scenario where the 'string' truncates is as
equally plausible as the one where it doesn't.
V
--
Please remove capital As from my address when replying by mail
Victor Bazarov wrote: Kai-Uwe Bux wrote: Victor Bazarov wrote:
lc****@yahoo.com wrote:
For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
'compare' takes into consideration _all_ contents, including any number of the "terminating" null characters. 'c_str()' effectively truncates the contents at the first null character.
Nitpick: it's not c_str() truncating the strings, it's strcmp() only reading until it finds the first null character.
Where is the guarantee that the pointer 'c_str()' returns in _not_ to some temporary buffer that only contains characters up to and including the first null char? Note that if the 'data()' of the std::string does _not_ contain a null char, the string _has_ to create a temporary buffer. So, it is _most_ likely that the temporary buffer is created. And if it is, there is no sense for the 'string' to copy anything there beyond the first null character. Hence, the scenario where the 'string' truncates is as equally plausible as the one where it doesn't.
That was not nitpicking. The standard (well - the draft, but I doubt
this has changed) says about c_str:
-1- Returns: A pointer to the initial element of an array of length
size() + 1 whose first size() elements equal the corresponding elements
of the string controlled by *this and whose last element is a null
character specified by charT().
Also, I doubt that many implementations will allocate a temporary
buffer. Most will just assure that the buffer always has room enough
for one extra character and place a null at size() whenever c_str is
called.
/Peter V -- Please remove capital As from my address when replying by mail
peter koch wrote: [..] The standard (well - the draft, but I doubt this has changed) says about c_str: -1- Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements equal the corresponding elements of the string controlled by *this and whose last element is a null character specified by charT().
You're right, my bad. So, we can safely say that all null characters are
represented in that array and while 'strcmp' does ignore everything after
the first null char it encounters, 'memcmp' should be able to compare them
correctly.
[..]
V
--
Please remove capital As from my address when replying by mail
Victor Bazarov wrote: Kai-Uwe Bux wrote: Victor Bazarov wrote:
lc****@yahoo.com wrote:
For two stl strings s1 and s2, I got different results from
strcmp(s1.c_str(), s2.c_str()) and s1.compare(s2)
can someone explain what these functions do? It seems that strcmp gives the "right" (i.e.wysiwyg) answer while compare() does not.
'compare' takes into consideration _all_ contents, including any number of the "terminating" null characters. 'c_str()' effectively truncates the contents at the first null character.
Nitpick: it's not c_str() truncating the strings, it's strcmp() only reading until it finds the first null character.
Where is the guarantee that the pointer 'c_str()' returns in _not_ to some temporary buffer that only contains characters up to and including the first null char?
[snip]
Standard, clause [21.3.6/1].
Best
Kai-Uwe Bux
Thanks! Great discussion. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Flzw |
last post by:
I've been trying to use std::string::compare and apparently it is case
sensitive, I searched the net but I can't find a way for it not to take case
into account, the solution I have for now is...
|
by: xuatla |
last post by:
Hi,
I want to compare two strings regardless of the lowercase or uppercase.
For example, "txt" same as "TXT", "Txt", ...
I know that there's stricmp in some c++ that can perform a lowercase...
|
by: collinm |
last post by:
hi
is there a function who allow to compare string and start at position X
example
str="print.jpp"
ext="jpg"
i would like to start to compare str at position 6
|
by: David zhu |
last post by:
I've got different result when comparing two strings
using "==" and string.Compare().
The two strings seems to have same value "1202002" in
the quick watch, and both have the same length 7 which I...
|
by: gerards_ |
last post by:
Hi all,
What I am trying to do is to String Compare just the first 6 characters
of a string.
For example:
For the compare string "Powama" I want to return true for any strings
that...
|
by: Maileen |
last post by:
Hi,
I have the following code :
Function GetRequestType(ByVal EvDt As String, ByVal StPeriod As String,
ByVal EdPeriod As String, ByVal TaskType As String) As Integer
Dim strtest As String
Dim...
|
by: Gwyn |
last post by:
If I test "A+" > "A-" then I get true
If I test "A+A" > "A-A" then I get false
What the hell is going on?! I can only imagine it's down to culture... but
why? my thread culture setting is...
|
by: Jim Langston |
last post by:
Is there any builtin lowercase std::string compare? Right now I'm doing
this:
if ( _stricmp( AmmoTypeText.c_str(), "GunBullet" ) == 0 )
AmmoType = Item_Ammo_GunBullet;
Is there anything the...
|
by: ndoe |
last post by:
how to compare string in file i mean compare that string content digit or alphabet,and 1 question more can we count that line if first line variable = 1,if read second line variable = 2 and so on...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
| |