char* concatenate

Discussion in 'C++' started by metamorphiq@gmail.com, Oct 18, 2006.

  1. Guest

    Hello,

    I'm a Java programmer, so I'm probably asking a very simple question
    here, but I have trouble solving it :)

    I'd like to know how you concatenate multiple (4, in my case) char* in
    C++, and have the result as a char*.
    I first tried using strcat, but you need a const char* as the second
    parameter to work, but I don't know all the issues regarding const
    chars, so maybe I overlooked something.

    Then I've tried converting them to strings, and it works, but I can't
    convert the result to a char* because c_str() gives me a const char*.
    Or maybe I could take the value of the const char* somehow and plug it
    in the char* result?

    Thank you very much,
    --Chris.
     
    , Oct 18, 2006
    #1
    1. Advertising

  2. Bart Guest

    wrote:
    > Hello,
    >
    > I'm a Java programmer, so I'm probably asking a very simple question
    > here, but I have trouble solving it :)
    >
    > I'd like to know how you concatenate multiple (4, in my case) char* in
    > C++, and have the result as a char*.
    > I first tried using strcat, but you need a const char* as the second
    > parameter to work, but I don't know all the issues regarding const
    > chars, so maybe I overlooked something.
    >
    > Then I've tried converting them to strings, and it works, but I can't
    > convert the result to a char* because c_str() gives me a const char*.
    > Or maybe I could take the value of the const char* somehow and plug it
    > in the char* result?


    The pointer returned by c_str() is indeed constant and you're not
    supposed to modify it. If you really need a char* you have to copy the
    pointed string into a char array first.

    But why do you want a char*? Since you're a Java programmer you should
    have no problems dealing with std::string instead of this old-style
    C-string stuff. What is it exactly that you're trying to do?

    Regards,
    Bart.
     
    Bart, Oct 18, 2006
    #2
    1. Advertising

  3. Guest

    " пиÑал(а):
    "
    > Hello,
    >
    > I'm a Java programmer, so I'm probably asking a very simple question
    > here, but I have trouble solving it :)
    >
    > I'd like to know how you concatenate multiple (4, in my case) char* in
    > C++, and have the result as a char*.
    > I first tried using strcat, but you need a const char* as the second
    > parameter to work, but I don't know all the issues regarding const
    > chars, so maybe I overlooked something.
    >
    > Then I've tried converting them to strings, and it works, but I can't
    > convert the result to a char* because c_str() gives me a const char*.
    > Or maybe I could take the value of the const char* somehow and plug it
    > in the char* result?
    >
    > Thank you very much,
    > --Chris.


    Hi, Chris.
    Maybe you have problems with strcat because your strings in char* are
    not terminated by '\0'?
     
    , Oct 18, 2006
    #3
  4. Guest

    Hi,

    > But why do you want a char*? Since you're a Java programmer you should
    > have no problems dealing with std::string instead of this old-style
    > C-string stuff. What is it exactly that you're trying to do?


    Alas, as with any programming tasks, I depend on the other programmers
    in the project.
    And in this case, this boils down to having to return a char*.

    But you gave me a good point -- I'll simply use string, and modify a
    few other lines in the project!

    Thanks,
    Chris.
     
    , Oct 18, 2006
    #4
  5. Guest


    > Hi, Chris.
    > Maybe you have problems with strcat because your strings in char* are
    > not terminated by '\0'?

    I'm sorry, I'm afraid my phrasing wasn't very clear -- strcat worked,
    but I needed a const char* as second argument and I only had char*, and
    I didn't know how to make a proper conversion.

    Thank you for your insight!
    --Chris.
     
    , Oct 18, 2006
    #5
  6. Bart Guest

    wrote:
    > > Hi, Chris.
    > > Maybe you have problems with strcat because your strings in char* are
    > > not terminated by '\0'?

    > I'm sorry, I'm afraid my phrasing wasn't very clear -- strcat worked,
    > but I needed a const char* as second argument and I only had char*, and
    > I didn't know how to make a proper conversion.


    char* gets converted to const char* implicitly. It's the other way
    around (const char* to char*) that's more problematic. The const is
    just there to tell you that the function promises not to modify the
    argument.

    Regards,
    Bart.
     
    Bart, Oct 18, 2006
    #6
  7. Ron Natalie Guest

    wrote:
    > Hello,
    >
    > I'm a Java programmer, so I'm probably asking a very simple question
    > here, but I have trouble solving it :)
    >
    > I'd like to know how you concatenate multiple (4, in my case) char* in
    > C++, and have the result as a char*.
    >

    The string type in C++ is called string.
    char* is a pointer to a single character.
     
    Ron Natalie, Oct 18, 2006
    #7
  8. Ron Natalie Guest

    wrote:
    >> Hi, Chris.
    >> Maybe you have problems with strcat because your strings in char* are
    >> not terminated by '\0'?

    > I'm sorry, I'm afraid my phrasing wasn't very clear -- strcat worked,
    > but I needed a const char* as second argument and I only had char*, and
    > I didn't know how to make a proper conversion.
    >
    > Thank you for your insight!
    > --Chris.
    >

    char* converts to const char* implicitly.
     
    Ron Natalie, Oct 18, 2006
    #8
  9. Bart Guest

    Ron Natalie wrote:
    > wrote:
    > > Hello,
    > >
    > > I'm a Java programmer, so I'm probably asking a very simple question
    > > here, but I have trouble solving it :)
    > >
    > > I'd like to know how you concatenate multiple (4, in my case) char* in
    > > C++, and have the result as a char*.
    > >

    > The string type in C++ is called string.


    I think the OP understands that, as he even mentioned it in his post.

    > char* is a pointer to a single character.


    But it is commonly interpreted as a pointer to the first element of a
    null-terminated array of characters. You have to be really pedantic to
    interpret "concatenate multiple char*" as meaning anything else than
    C-style string concatenation.

    Regards,
    Bart.
     
    Bart, Oct 18, 2006
    #9
  10. Guest

    Solved!! Thank you all! :)
    Back to Java with me now :D

    --Chris.
     
    , Oct 18, 2006
    #10
  11. Rolf Magnus Guest

    Bart wrote:

    > Ron Natalie wrote:
    >> wrote:
    >> > Hello,
    >> >
    >> > I'm a Java programmer, so I'm probably asking a very simple question
    >> > here, but I have trouble solving it :)
    >> >
    >> > I'd like to know how you concatenate multiple (4, in my case) char* in
    >> > C++, and have the result as a char*.
    >> >

    >> The string type in C++ is called string.

    >
    > I think the OP understands that, as he even mentioned it in his post.
    >
    >> char* is a pointer to a single character.

    >
    > But it is commonly interpreted as a pointer to the first element of a
    > null-terminated array of characters. You have to be really pedantic to
    > interpret "concatenate multiple char*" as meaning anything else than
    > C-style string concatenation.


    Maybe, but many programmers, especially those that are new to C or C++,
    think that char* is supposed to be the string type. Phrases
    like "concatenate multiple char*" are often (maybe not in this case, but
    still often) an indication for such confusion. So it's a good idea to
    mention clearly what char* actually is.
     
    Rolf Magnus, Oct 18, 2006
    #11
  12. Metamorphiq posted:

    > I'd like to know how you concatenate multiple (4, in my case) char* in
    > C++, and have the result as a char*.


    #include <cstddef>
    #include <cassert>
    #include <cstring>
    #include <cstdlib>

    #define restrict

    char *const Con4Strs(char const *const restrict a,
    char const *const restrict b,
    char const *const restrict c,
    char const *const restrict d)
    {
    assert(a); assert(b); assert(c); assert(d);

    using std::size_t; using std::strlen; using std::memcpy;

    size_t const lenA = strlen(a);
    size_t const lenB = strlen(b);
    size_t const lenC = strlen(c);
    size_t const lenD = strlen(d);

    char *const buf = new char[lenA+lenB+lenC+lenD+1];

    register char *p = buf;

    memcpy(p,a,lenA); p += lenA;
    memcpy(p,b,lenB); p += lenB;
    memcpy(p,c,lenC); p += lenC;
    memcpy(p,d,lenD);

    p[lenD] = 0;

    return buf;
    }

    --

    Frederick Gotham
     
    Frederick Gotham, Oct 18, 2006
    #12
  13. Jim Langston Guest

    <> wrote in message
    news:...
    > Hello,
    >
    > I'm a Java programmer, so I'm probably asking a very simple question
    > here, but I have trouble solving it :)
    >
    > I'd like to know how you concatenate multiple (4, in my case) char* in
    > C++, and have the result as a char*.
    > I first tried using strcat, but you need a const char* as the second
    > parameter to work, but I don't know all the issues regarding const
    > chars, so maybe I overlooked something.


    If a function expects a const char* and you have a char* it works without
    problem. It's going the other way that's a problem, I.E., you have a const
    char* and the function expects a char*.

    A const char* means that the function will not modify the contents of the
    pointed to c-string used with c-strings. Which is good. You should be able
    to use strcat without problems, although strcat has it's own problems.

    > Then I've tried converting them to strings, and it works, but I can't
    > convert the result to a char* because c_str() gives me a const char*.
    > Or maybe I could take the value of the const char* somehow and plug it
    > in the char* result?


    The lifetime of a std::string.c_str() is only until the string goes out of
    scope, or the string is modified somehow. You should not return a .c_str()
    from a function. Return a std::string instead.

    > Thank you very much,
    > --Chris.


    Even though you could get strcat to work for you, I would change everythign
    to work with std::string and return a std::string, and modify the code that
    calls the function to accept a std::string. Buffer problems just tend to go
    away when you use std::string instead of c-style strings, especially for
    what you are doing, modifying or returning a string inside a function.
     
    Jim Langston, Oct 18, 2006
    #13
  14. Kai-Uwe Bux Guest

    Rolf Magnus wrote:

    > Bart wrote:
    >
    >> Ron Natalie wrote:
    >>> wrote:
    >>> > Hello,
    >>> >
    >>> > I'm a Java programmer, so I'm probably asking a very simple question
    >>> > here, but I have trouble solving it :)
    >>> >
    >>> > I'd like to know how you concatenate multiple (4, in my case) char* in
    >>> > C++, and have the result as a char*.
    >>> >
    >>> The string type in C++ is called string.

    >>
    >> I think the OP understands that, as he even mentioned it in his post.
    >>
    >>> char* is a pointer to a single character.

    >>
    >> But it is commonly interpreted as a pointer to the first element of a
    >> null-terminated array of characters. You have to be really pedantic to
    >> interpret "concatenate multiple char*" as meaning anything else than
    >> C-style string concatenation.

    >
    > Maybe, but many programmers, especially those that are new to C or C++,
    > think that char* is supposed to be the string type.


    Well, char* is a type that can be used to represent 0-terminated sequences
    characters; and string operations modelled upon that representation are
    provided in the header <cstring>.

    > Phrases
    > like "concatenate multiple char*" are often (maybe not in this case, but
    > still often) an indication for such confusion.


    Which confusion? I think, those phrases only indicate that someone knows
    that C-strings are supported in C++ and wants to use them. Sometimes the
    reason fur such a wish might be that the person does not know about the
    existence of std::string. But that is just a lack of knowledge, not a state
    of confusion.

    > So it's a good idea to
    > mention clearly what char* actually is.


    I think, a good idea is to just tell them about the existence of std::string
    and to encourage its use.


    Best

    Kai-Uwe Bux
     
    Kai-Uwe Bux, Oct 19, 2006
    #14
  15. Rolf Magnus Guest

    Kai-Uwe Bux wrote:

    >>>> The string type in C++ is called string.
    >>>
    >>> I think the OP understands that, as he even mentioned it in his post.
    >>>
    >>>> char* is a pointer to a single character.
    >>>
    >>> But it is commonly interpreted as a pointer to the first element of a
    >>> null-terminated array of characters. You have to be really pedantic to
    >>> interpret "concatenate multiple char*" as meaning anything else than
    >>> C-style string concatenation.

    >>
    >> Maybe, but many programmers, especially those that are new to C or C++,
    >> think that char* is supposed to be the string type.

    >
    > Well, char* is a type that can be used to represent 0-terminated sequences
    > characters;


    It can be (and often is) used to point to the first element of one. One
    could say it can "represent" one. Still it's not a string type, and if you
    try to use it like one, it won't work and might give surprising results.

    > and string operations modelled upon that representation are
    > provided in the header <cstring>.
    >
    >> Phrases
    >> like "concatenate multiple char*" are often (maybe not in this case, but
    >> still often) an indication for such confusion.

    >
    > Which confusion?


    I have seen quite often that beginners don't understand why their "string
    operations" don't work, including concatenating two char* with operator+ or
    something like:

    char* p = "Hello, world";
    p[1] = 'X';

    or maybe even:

    char* p = "Hello, world, the number is: ";
    char* q = p + 3;

    which is actually correct, but obviously does something entirely different
    from what was intended. I could probably give you a dozen other examples.
    That is all just the result of confusing char* for a real string type. It's
    important to know that C does not have a string type at all and that C++
    provides the class std::string for this.

    > I think, those phrases only indicate that someone knows that C-strings are
    > supported in C++ and wants to use them. Sometimes the reason fur such a
    > wish might be that the person does not know about the existence of
    > std::string. But that is just a lack of knowledge, not a state of
    > confusion.


    Well, confusion is mostly the result of a lack of knowledge, isn't it?

    >> So it's a good idea to mention clearly what char* actually is.

    >
    > I think, a good idea is to just tell them about the existence of
    > std::string and to encourage its use.


    That definitely too, yes.
     
    Rolf Magnus, Oct 19, 2006
    #15
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Abby
    Replies:
    5
    Views:
    2,005
    James Antill
    Aug 19, 2003
  2. Martin Andersson

    shift and concatenate char *

    Martin Andersson, Nov 16, 2005, in forum: C Programming
    Replies:
    1
    Views:
    582
    Alex Fraser
    Nov 16, 2005
  3. lovecreatesbeauty
    Replies:
    1
    Views:
    1,062
    Ian Collins
    May 9, 2006
  4. mc

    concatenate char to string (c ansi)

    mc, May 17, 2010, in forum: C Programming
    Replies:
    2
    Views:
    4,589
    Bichejo
    May 18, 2010
  5. Carlos

    Concatenate/De-Concatenate

    Carlos, Oct 12, 2012, in forum: VHDL
    Replies:
    10
    Views:
    893
Loading...

Share This Page