Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Re: C Style Strings

Reply
Thread Tools

Re: C Style Strings

 
 
kwikius
Guest
Posts: n/a
 
      06-01-2006
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;
}

#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

 
Reply With Quote
 
 
 
 
Richard Bos
Guest
Posts: n/a
 
      06-01-2006
"kwikius" <(E-Mail Removed)> wrote:

> scroopy wrote:
> > How do I append the contents of pString2 to pString? (giving "Blah
> > Blah Blah")

>
> #include <malloc.h>
> #include <cstring>


This is not C...

> char* concat(const char * str1, const char* str2)
> {
> char * result = (char*) malloc(strlen( str1) + strlen (str2) + 1);


....and this is the wrong way to do this in C. And, really, also in C++:
use new.

So don't cross-post stuff like that. Follow-ups set.

Richard
 
Reply With Quote
 
 
 
 
Richard Heathfield
Guest
Posts: n/a
 
      06-01-2006
Richard Bos said:

> "kwikius" <(E-Mail Removed)> wrote:
>
>> scroopy wrote:
>> > How do I append the contents of pString2 to pString? (giving "Blah
>> > Blah Blah")

>>
>> #include <malloc.h>
>> #include <cstring>

>
> This is not C...


....and it's not C++ either, so I'm not sure why you set followups to clc++.

The entire article, in fact (his, not yours), was a classic example of the
kind of thing you get in the Hackitt and Scarper school of programming.

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
 
Reply With Quote
 
kwikius
Guest
Posts: n/a
 
      06-01-2006
Richard Heathfield wrote:
> Richard Bos said:
>
> > "kwikius" wrote:
> >
> >> scroopy wrote:
> >> > How do I append the contents of pString2 to pString? (giving "Blah
> >> > Blah Blah")
> >>
> >> #include <malloc.h>
> >> #include <cstring>

> >
> > This is not C...

>
> ...and it's not C++ either, so I'm not sure why you set followups to clc++.
>
> The entire article, in fact (his, not yours), was a classic example of the
> kind of thing you get in the Hackitt and Scarper school of programming.


Thats great! Thanks! Its always good to get positive feedback!

regards
Andy Little

 
Reply With Quote
 
Roland Pibinger
Guest
Posts: n/a
 
      06-01-2006
On 1 Jun 2006 01:57:05 -0700, "kwikius"
<(E-Mail Removed)> wrote:
>Richard Heathfield wrote:
>> The entire article, in fact (his, not yours), was a classic example of the
>> kind of thing you get in the Hackitt and Scarper school of programming.

>
>Thats great! Thanks! Its always good to get positive feedback!


BTW, an interesting C-string library can be found here:
http://synesis.com.au/software/cstring/index.html

Best wishes,
Roland Pibinger
 
Reply With Quote
 
kwikius
Guest
Posts: n/a
 
      06-01-2006
Roland Pibinger wrote:
> On 1 Jun 2006 01:57:05 -0700, "kwikius"
> <(E-Mail Removed)> wrote:
> >Richard Heathfield wrote:
> >> The entire article, in fact (his, not yours), was a classic example of the
> >> kind of thing you get in the Hackitt and Scarper school of programming.

> >
> >Thats great! Thanks! Its always good to get positive feedback!

>
> BTW, an interesting C-string library can be found here:
> http://synesis.com.au/software/cstring/index.html


It looks like a C++ style string written in C! The telling part is the
create and destroy functions, which would of course be replaced by
language facilities if written in C++.

regards
Andy Little

 
Reply With Quote
 
Martin Ambuhl
Guest
Posts: n/a
 
      06-01-2006
kwikius wrote:
> 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>

This is neither a C header nor a C++ header, so off-topic in both groups
to which you posted.

> #include <cstring>

This is not a C header, so off-topic in one of the groups to which you
posted.

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.

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.
 
Reply With Quote
 
Malcolm
Guest
Posts: n/a
 
      06-01-2006
"kwikius" <(E-Mail Removed)> wrote
> 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.
>
> #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?
>
> 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


 
Reply With Quote
 
kwikius
Guest
Posts: n/a
 
      06-01-2006
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.


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?

> 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

 
Reply With Quote
 
santosh
Guest
Posts: n/a
 
      06-02-2006
kwikius wrote:
> Martin Ambuhl wrote:
> > 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.

Third-party garbage collectors are available for C. But if you really
want these features built into the langauge, maybe you should consider
Java?

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

> 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++.

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

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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Strings, Strings and Damned Strings Ben C Programming 14 06-24-2006 05:09 AM
Why do so many new style ansi streams and files etc, still use old style strings? Kza C++ 4 03-03-2006 07:00 PM
Catching std::strings and c-style strings at once Kurt Krueckeberg C++ 2 11-17-2004 03:53 AM
Need help with Style conversion from Style object to Style key/value collection. Ken Varn ASP .Net Building Controls 0 04-26-2004 07:06 PM
Comparing strings from within strings Rick C Programming 3 10-21-2003 09:10 AM



Advertisments