 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
scroopy Guest
|
Posted: Thu Jun 01, 2006 8:20 am Post subject: C Style Strings |
|
|
Hi,
I've always used std::string but I'm having to use a 3rd party library
that returns const char*s. Given:
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
How do I append the contents of pString2 to pString? (giving "Blah
Blah Blah")
I looked at strcat but that crashes with an unhandled exception.
Thanks |
|
| Back to top |
|
 |
Guest
|
Posted: Thu Jun 01, 2006 8:20 am Post subject: Re: C Style Strings |
|
|
scroopy wrote:
| Quote: | Hi,
I've always used std::string but I'm having to use a 3rd party library
that returns const char*s. Given:
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
How do I append the contents of pString2 to pString? (giving "Blah
Blah Blah")
I looked at strcat but that crashes with an unhandled exception.
|
That's easy, do it the C way:
char* result=new char[strlen(s1)+strlen(s2)+1];
strcpy(result,s1);
strcat(result,s2);
Regards
Jiri Palecek |
|
| Back to top |
|
 |
Kai-Uwe Bux Guest
|
Posted: Thu Jun 01, 2006 8:20 am Post subject: Re: C Style Strings |
|
|
scroopy wrote:
| Quote: | Hi,
I've always used std::string but I'm having to use a 3rd party library
that returns const char*s. Given:
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
How do I append the contents of pString2 to pString? (giving "Blah
Blah Blah")
|
a) Keep using std::string for your own stuff. The std::string class has
methods that allow you to interact with C-style string interfaces of
libraries.
b) Note that in your example above, pString1 is initialized to a const
string. Any attempt to modify that string would be undefined behavior. The
danger lies in not declaring pString1 as a char const *.
c) You could do:
#include <string>
#include <algorithm>
char * strdup ( std::string str ) {
char * result = new char [ str.length() +1 ];
std::copy( str.begin(), str.end(), result );
result[ str.length() ] = 0;
return ( result );
}
int main ( void ) {
char * pString1 = "Blah ";
char const * pString2 = "Blah Blah";
pString1 = strdup( std::string( pString1 ).append( pString2 ) );
}
However, I would prefer to use std::string for my own stuff:
#include <string>
int main ( void ) {
std::string pString1 = "Blah "; // rhs returned by some library
std::string pString2 = "Blah Blah"; // rhs returned by some library
pString1.append( pString2 );
}
Best
Kai-Uwe Bux |
|
| Back to top |
|
 |
Roland Pibinger Guest
|
Posted: Thu Jun 01, 2006 8:20 am Post subject: Re: C Style Strings |
|
|
On Thu, 01 Jun 2006 08:35:36 +0100, scroopy <scroopy (AT) nospam (DOT) com>
wrote:
| Quote: | I've always used std::string but I'm having to use a 3rd party library
that returns const char*s.
|
First you need to find out if you 'own' the returned string, i.e. if
you must free (maybe delete) the returned char*. Good C libraries
usually don't require the user to call free.
| Quote: | Given:
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
How do I append the contents of pString2 to pString? (giving "Blah
Blah Blah")
|
You can append a const char* to a std::string:
string myString = "Blah ";
const char* s = myLibFunc (...);
if (s) {
myString += s; // or myString.append(s);
}
// free (s); // if it's a bad lib
Best wishes,
Roland Pibinger |
|
| Back to top |
|
 |
kwikius Guest
|
Posted: Thu Jun 01, 2006 8:20 am Post subject: Re: C Style Strings |
|
|
scroopy wrote:
| Quote: | Hi,
I've always used std::string but I'm having to use a 3rd party library
that returns const char*s. Given:
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
How do I append the contents of pString2 to pString? (giving "Blah
Blah Blah")
|
#include <malloc.h>
#include <cstring>
char* concat(const char * str1, const char* str2)
{
char * result = (char*) malloc(strlen( str1) + strlen (str2) + 1);
if( result != NULL){
strcpy(result,str1);
strcat(result, str2);
}
return result;
}
#include <iostream>
#include <string>
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
int main()
{
// C-style
char* str = concat(pString1,pString2);
if(str != NULL){
std::cout << str <<'\n';
free(str);
}
// C++ style
std::string str1=std::string(pString1) + pString2;
std::cout << str1 <<'\n';
}
I'm not sure if that is the optimal C method. Its interesting to note
how much better the C++ version is though!
regards
Andy Little |
|
| Back to top |
|
 |
Malcolm Guest
|
Posted: Fri Jun 02, 2006 1:31 am Post subject: Re: C Style Strings |
|
|
"kwikius" <andy (AT) servocomm (DOT) freeserve.co.uk> wrote
| Quote: | scroopy wrote:
Hi,
I've always used std::string but I'm having to use a 3rd party library
that returns const char*s. Given:
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
How do I append the contents of pString2 to pString? (giving "Blah
Blah Blah")
#include <malloc.h
#include <cstring
char* concat(const char * str1, const char* str2)
{
char * result = (char*) malloc(strlen( str1) + strlen (str2) + 1);
if( result != NULL){
strcpy(result,str1);
strcat(result, str2);
}
return result;
}
Perfectly unexceptional code. |
It won't execute as efficiently as it might, but then most programs can
manipulate a string much faster than a human can read it, however
inefficiently written.
If we want we can do a speed-up
void fastconcat(char *out, char *str1, char *str2)
{
while(*str1)
*out++ = *str1++;
while(*str2)
*out++ = *str2++;
*out = 0;
}
this is a bit of nuisance since it throws the burden of memory allocation
onto the user, it is also rather dangerous sinvce we don't check the buffer.
But it will be very fast. That's the beauty of C, you can roll the function
to the problem you face.
| Quote: |
#include <iostream
#include <string
char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
int main()
{
// C-style
char* str = concat(pString1,pString2);
if(str != NULL){
std::cout << str <<'\n';
free(str);
}
// C++ style
std::string str1=std::string(pString1) + pString2;
Ok what's going on here? |
You have a string, and now you are calling what looks like a string
constructor to create another type of string. Why do you need two types of
string in the program? Do they behave differently when passed to cout? How
do I know that they will behave in the same way?
| Quote: |
std::cout << str1 <<'\n';
}
I'm not sure if that is the optimal C method. Its interesting to note
how much better the C++ version is though!
So what's the big - O analysis of that '+' operation? Where is this |
documented? What if I want to sacrifice a bit of safety for speed, as we did
with C? Can I overload the string '+' operator to achieve this?
Apologies to our friends on C++, but this was a provocative post.
--
Buy my book 12 Common Atheist Arguments (refuted)
$1.25 download or $7.20 paper, available www.lulu.com/bgy1mm |
|
| Back to top |
|
 |
kwikius Guest
|
Posted: Fri Jun 02, 2006 3:04 am Post subject: Re: C Style Strings |
|
|
Martin Ambuhl wrote:
| Quote: | kwikius wrote:
#include <malloc.h
This is neither a C header nor a C++ header, so off-topic in both groups
to which you posted.
|
Ok.
| Quote: | #include <cstring
This is not a C header, so off-topic in one of the groups to which you
posted.
|
Ok.
| Quote: | If you _must_ post to both <news:comp.lang.c++> and <news:comp.lang.c>,
try to make your post topical in each. As it stands, your post is
topical in neither.
|
The code in the post attempts to highlight the different problems of
dealing with resource management in both languages. Having to deal
manually with resources and having to check results of functions for
validity are both sources of additional code complexity in C it seems.
Maybe there are plans to address this situation in the next version of
the C standard?
| Quote: | There is hardly ever any excuse for posting to both newsgroups; these
are concerned with two different languages, and advice given in posts to
both is almost certainly going to be wrong, or at least non-idiomatic,
in at least one of them.
|
If I have given incorect advice, I apologise. FWIW I certainly dont
advocate use of malloc or C-style strings or manual memory management.
IOW I advocate use of C++ over C. C holds no advantage whatever. The
concat function shows very neatly why it is best to avoid C-style
strings in C++. In C it seems that it is possible to do better though
there seems to be no standard higher level string library. Maybe there
are plans to address this situation in the next version of the C
standard?
Whatever... Happy coding!
regards
Andy Little |
|
| Back to top |
|
 |
tedu Guest
|
Posted: Fri Jun 02, 2006 3:20 am Post subject: Re: C Style Strings |
|
|
kwikius wrote:
| Quote: | char* pString1 = "Blah ";
const char* pString2 = "Blah Blah";
int main()
{
// C-style
char* str = concat(pString1,pString2);
if(str != NULL){
std::cout << str <<'\n';
free(str);
}
// C++ style
std::string str1=std::string(pString1) + pString2;
std::cout << str1 <<'\n';
}
I'm not sure if that is the optimal C method. Its interesting to note
how much better the C++ version is though!
|
yeah, it's always better when programs randomly drop
"terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc
Aborted"
messages on the screen and then stop working. |
|
| Back to top |
|
 |
Chris Smith Guest
|
Posted: Fri Jun 02, 2006 4:20 am Post subject: Re: C Style Strings |
|
|
kwikius <andy (AT) servocomm (DOT) freeserve.co.uk> wrote:
| Quote: | In C it seems that it is possible to do better though
there seems to be no standard higher level string library. Maybe there
are plans to address this situation in the next version of the C
standard?
|
One very big difference between C and some other languages (say, Java
and C# and VB, for example) is that there is no big organization that's
got billions of dollars invested in making C the next Big Thing. As a
result, the language is not as large or complex, and far more stable,
than some of these other languages. I doubt you'll see future versions
of C making really huge changes in the language or APIs to conform with
higher-level programming goals. After all, if you wanted this you
wouldn't use C, and the standards organization doesn't particularly care
if you use C or not.
Short answer: probably not.
--
Chris Smith - Lead Software Developer / Technical Trainer
MindIQ Corporation |
|
| Back to top |
|
 |
santosh Guest
|
Posted: Fri Jun 02, 2006 4:20 am Post subject: Re: C Style Strings |
|
|
kwikius wrote:
| Quote: | Martin Ambuhl wrote:
kwikius wrote:
.... snip ... |
| Quote: | The code in the post attempts to highlight the different problems of
dealing with resource management in both languages. Having to deal
manually with resources and having to check results of functions for
validity are both sources of additional code complexity in C it seems.
Maybe there are plans to address this situation in the next version of
the C standard?
|
I guess you want garbage collection and exceptions support. Both impose
run-time overhead. Increasingly, C is used in embedded programming
where both might be unfeasible and unnecessary. I don't think there is
much chance that they will be standardised.
Third-party garbage collectors are available for C. But if you really
want these features built into the langauge, maybe you should consider
Java?
| Quote: | If I have given incorect advice, I apologise. FWIW I certainly dont
advocate use of malloc or C-style strings or manual memory management.
|
Good for you.
| Quote: | IOW I advocate use of C++ over C. C holds no advantage whatever.
|
It depends on what you're trying to do. Sweeping generalisations aren't
correct.
| Quote: | The concat function shows very neatly why it is best to avoid C-style
strings in C++.
|
Indeed. If you decide to program in C++, then you should program in
C++.
| Quote: | In C it seems that it is possible to do better though
there seems to be no standard higher level string library.
|
Yes, anyone who wants an abstract string library has to either roll his
own or use pre-existing ones. The former case, especially, allows one
to optimise for their specific requirements, though I don't think the
code will be significantly better than std::string.
| Quote: | Maybe there are plans to address this situation in the next version of the C
standard?
|
I doubt it. Even the next revision of the standard is a minimum of 3-4
years away, and the standard committee have always resisted turning C
into another C++/Java wannabe. |
|
| Back to top |
|
 |
kwikius Guest
|
Posted: Fri Jun 02, 2006 11:20 am Post subject: Re: C Style Strings |
|
|
santosh wrote:
| Quote: | kwikius wrote:
... snip ...
The code in the post attempts to highlight the different problems of
dealing with resource management in both languages. Having to deal
manually with resources and having to check results of functions for
validity are both sources of additional code complexity in C it seems.
Maybe there are plans to address this situation in the next version of
the C standard?
I guess you want garbage collection and exceptions support. Both impose
run-time overhead. Increasingly, C is used in embedded programming
where both might be unfeasible and unnecessary. I don't think there is
much chance that they will be standardised.
|
Yes. C++ claims to be as useable as C in embedded systems, but I have
heard that use of exceptions rather than error codes causes problems.
There is a marginal effect on performance but AFAIK the larger problems
are due to the latency involved in unwinding the stack as well as
apparently extra memory use for the exception handling code. I guess
that the different style of error handling also causes major problems
with integration. There is probably also an element of sticking with
the way things have always been done. AFAIK Most compilers can turn
off exceptions, though I think this is non-standard even in the
so-called free-standing c++ implementations.
| Quote: | Third-party garbage collectors are available for C. But if you really
want these features built into the langauge, maybe you should consider
Java?
|
I kind of like Java Swing.
| Quote: | If I have given incorect advice, I apologise. FWIW I certainly dont
advocate use of malloc or C-style strings or manual memory management.
Good for you.
IOW I advocate use of C++ over C. C holds no advantage whatever.
It depends on what you're trying to do. Sweeping generalisations aren't
correct.
|
Actually after posting I am pretty sure that the C code will be faster.
Creating a C++ string probably involves an allocation. The C++ string
concat operator(+) may also involve an allocation,whereas the C code
only has one allocation. That is the downside of automated resource
management.
| Quote: | The concat function shows very neatly why it is best to avoid C-style
strings in C++.
Indeed. If you decide to program in C++, then you should program in
C++.
|
Well I like other languages too. I like the platform independent spirit
of Java and its GUI support, but I guess I would miss C++.
regrads
Andy Little |
|
| Back to top |
|
 |
Guest
|
Posted: Fri Jun 02, 2006 5:20 pm Post subject: Re: C Style Strings |
|
|
kwikius wrote:
| Quote: | Martin Ambuhl wrote:
kwikius wrote:
#include <malloc.h
This is neither a C header nor a C++ header, so off-topic in both groups
to which you posted.
Ok.
#include <cstring
This is not a C header, so off-topic in one of the groups to which you
posted.
Ok.
If you _must_ post to both <news:comp.lang.c++> and <news:comp.lang.c>,
try to make your post topical in each. As it stands, your post is
topical in neither.
|
These guys are real great at keeping the snow out of their cave, even
if they don't realize that its part of an avalanche on top of them.
| Quote: | The code in the post attempts to highlight the different problems of
dealing with resource management in both languages. Having to deal
manually with resources and having to check results of functions for
validity are both sources of additional code complexity in C it seems.
Maybe there are plans to address this situation in the next version of
the C standard?
|
The C standard is not something where people try to actually address
actual real world problems. You can look at their own manifesto --
they claim to "endorse standard practice" and things along those lines.
So in a sense they *endorse* all the problems with the C language, so
long as it is standard practice. Hence the continuing presence of
"gets" in the library.
C++ obviously goes a long way to addressing resources and error
handling in a useful way (RAII and real exception handling) however it
is not a garbage collecting language and thus it will always take a
little more effort to program in it properly. And of course C leaves
the whole concept of construction and destruction up to the programmer.
| Quote: | There is hardly ever any excuse for posting to both newsgroups; these
are concerned with two different languages, and advice given in posts to
both is almost certainly going to be wrong, or at least non-idiomatic,
in at least one of them.
If I have given incorect advice, I apologise. FWIW I certainly dont
advocate use of malloc or C-style strings or manual memory management.
IOW I advocate use of C++ over C. C holds no advantage whatever.
|
Well hang on -- this is precisely where you can make an argument for C
over C++. In C since you are forced to do everything by hand, you have
the advantage of being able to do everything by hand. For example, you
use local stack based memory to back certain allocations if you know
that the lifetime of the resource is equal to the lifetime of the
function call. In C++ you can hope your compiler can figure it out; if
not it will use new/delete which eventually falls back to malloc/free
which is hundreds of times slower.
| Quote: | [...] The
concat function shows very neatly why it is best to avoid C-style
strings in C++. In C it seems that it is possible to do better though
there seems to be no standard higher level string library. Maybe there
are plans to address this situation in the next version of the C
standard?
|
Take a look at http://bstring.sf.net/ . I claim that even just the C
API is generally better than C++'s std::string, or Microsoft's CString
classes. But it includes a C++ API as well which should make everyone
happy.
--
Paul Hsieh
http://www.pobox.com/~qed/
http://bstring.sf.net/ |
|
| Back to top |
|
 |
Tomás Guest
|
Posted: Sat Jun 03, 2006 9:10 am Post subject: Re: C Style Strings |
|
|
Malcolm posted:
| Quote: | If we want we can do a speed-up
void fastconcat(char *out, char *str1, char *str2)
{
while(*str1)
*out++ = *str1++;
while(*str2)
*out++ = *str2++;
*out = 0;
}
|
I'd say that has the potential to "run slower" than a version which uses
strcpy. A system would be more efficient copying int's than char's, so
strcpy could be implemented platform-specifically as something like:
(Unchecked code:)
inline bool NoByteZero(unsigned const v)
{
return ( ( (v & 0x7F7F7F7F) + 0x7F7F7F7F ) | v ) | 0x7F7F7F7F;
}
void strcpy(char *pdest, const char *psource)
{
int *idest = reinterpret_cast<int*>(pdest);
int *isource = reinterpret_cast<int*>(psource);
for ( ; NoByteZero(*isource); *idest++ = *isource++);
char *cdest = reinterpret_cast<char*>(idest);
char *csource = reinterpret_cast<char*>(isource);
while( *cdest++ = *csource++ );
}
(This code makes the presumption that on the given platform, it's okay to
access memory which isn't yours.)
-Tomás |
|
| Back to top |
|
 |
Noah Roberts Guest
|
Posted: Sun Jun 04, 2006 8:04 am Post subject: Re: C Style Strings |
|
|
websnarf (AT) gmail (DOT) com wrote:
| Quote: | /* In C: */
int catHi (bstring b) {
static struct tagbstring hi = bsStatic ("hi"); /* init-time */
bconcat (b, &hi); /* Essentially an addition and a memcpy */
}
// in C++:
void catHi (CBString &b) {
b += "hi"; // Requires implicit construction of CBString("hi") or
some
// sort of strlen() being called on "hi" before
appending.
}
|
The only difference between the two code slices is syntax; they mean
the same thing. Of course, to be truely certain of that we would have
to know what bsStatic() does, what bconcat does, what CBString(const
char*) does and what CBString::operator += does. What I think they all
mean just looking at the above would result in exactly the same
operations. Of course there is nothing requiring that CBString be
implemented so that += does not accept a const char* directly.
Even at that.... your code example does not prove your point at all.
It does not illustrate any difference between C and C++ with regard to
stack variables. |
|
| Back to top |
|
 |
Ian Collins Guest
|
Posted: Sun Jun 04, 2006 9:10 am Post subject: Re: C Style Strings |
|
|
Phlip wrote:
| Quote: | Ian Collins wrote:
Malcolm wrote:
Profile, don't speculate.
That's wonderful advice, as long as your code is always running on the
same
platform. My programs have to run on anything with reasonable efficiency.
Then you can't use assembly and have to code to the lowest common
denominator.
Profiling isn't just about determining which low-level bits to split.
Who said it was? |
--
Ian Collins. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|