Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. How to copy string with NULL

How to copy string with NULL

Scheduled Pinned Locked Moved C / C++ / MFC
tutorial
17 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C color Aljechin

    char szSource[23] = {"Before\0After"}; char szDest[23]; ptr = memcpy(szDest,szSource,22); printf("%s %d",szDest,strlen(szDest)); Hi, may i please request you to just try this code and comment on why memcpy is failing? Is it the way it goes or am I wrong somewhere? Can you suggest some workaround? Thanks for your time. :rose:

    N Offline
    N Offline
    Nibu babu thomas
    wrote on last edited by
    #8

    Aljechin wrote:

    Hi, may i please request you to just try this code and comment on why memcpy is failing? Is it the way it goes or am I wrong somewhere? Can you suggest some workaround? Thanks for your time.

    Sure! Please look up memcpy in MSDN. There is a working demo there. See you were saying that szSource contains NULL characters right? So strlen won't work because it will return when it finds the first null character. Same with printf and other functions. They all return when the first NULL character is found. So if your string is...

    "Nibu\0is a\0\0\0good\0boy\0".

    strlen will return 4. printf will print only Nibu


    Nibu thomas A Developer Programming tips[^]  My site[^]

    C 1 Reply Last reply
    0
    • C color Aljechin

      char szSource[23] = {"Before\0After"}; char szDest[23]; ptr = memcpy(szDest,szSource,22); printf("%s %d",szDest,strlen(szDest)); I went through that page, but not getting it. Can you show me a small code snippet of how do i copy that szSource into szDest? Sorry if a very elementary question. :rose:

      C Offline
      C Offline
      Cedric Moonen
      wrote on last edited by
      #9

      What are you trying to do exactly ? Is not because memcpy sucessfully copied the source into the destination that the '\0' character will be removed. It will still be present in the new string so as soon as you try to get its length or print the string, you will only have the begining of the string. This is totally logical.


      Cédric Moonen Software developer
      Charting control

      C 1 Reply Last reply
      0
      • N Nibu babu thomas

        Aljechin wrote:

        Hi, may i please request you to just try this code and comment on why memcpy is failing? Is it the way it goes or am I wrong somewhere? Can you suggest some workaround? Thanks for your time.

        Sure! Please look up memcpy in MSDN. There is a working demo there. See you were saying that szSource contains NULL characters right? So strlen won't work because it will return when it finds the first null character. Same with printf and other functions. They all return when the first NULL character is found. So if your string is...

        "Nibu\0is a\0\0\0good\0boy\0".

        strlen will return 4. printf will print only Nibu


        Nibu thomas A Developer Programming tips[^]  My site[^]

        C Offline
        C Offline
        color Aljechin
        wrote on last edited by
        #10

        Thank you so much. I will surely check that example and get back to you with the problem status. peace homie :rose:

        1 Reply Last reply
        0
        • C Cedric Moonen

          What are you trying to do exactly ? Is not because memcpy sucessfully copied the source into the destination that the '\0' character will be removed. It will still be present in the new string so as soon as you try to get its length or print the string, you will only have the begining of the string. This is totally logical.


          Cédric Moonen Software developer
          Charting control

          C Offline
          C Offline
          color Aljechin
          wrote on last edited by
          #11

          What I am doing? PIP (Peripheral Interface Programming). I have generated a sequence of binary data which will be understood by a peripheral device. For example, we issue a print command from notepad. Its not the .txt file that is sent to the printer by the OS. But a series of printer-understood data is sent. My program generates such device-understandable data which could be just dumped into the port of the device and it will print some meaningful text or act accordingly. I have this binary (kinda junk) stored in unsigned char array. So, I am trying to figure out a way to do this. :) :rose:

          C 1 Reply Last reply
          0
          • C color Aljechin

            What I am doing? PIP (Peripheral Interface Programming). I have generated a sequence of binary data which will be understood by a peripheral device. For example, we issue a print command from notepad. Its not the .txt file that is sent to the printer by the OS. But a series of printer-understood data is sent. My program generates such device-understandable data which could be just dumped into the port of the device and it will print some meaningful text or act accordingly. I have this binary (kinda junk) stored in unsigned char array. So, I am trying to figure out a way to do this. :) :rose:

            C Offline
            C Offline
            Cedric Moonen
            wrote on last edited by
            #12

            So, what is the problem ? Your data is there but if you try to display it with a function that waits for a string, you won't be able to see past the zero char. Just send your buffer and it will work. You need to remember the size of your string of course because strlen won't work.


            Cédric Moonen Software developer
            Charting control

            C 1 Reply Last reply
            0
            • C color Aljechin

              char szSource[23] = {"Before\0After"}; char szDest[23]; ptr = memcpy(szDest,szSource,22); printf("%s %d",szDest,strlen(szDest)); I went through that page, but not getting it. Can you show me a small code snippet of how do i copy that szSource into szDest? Sorry if a very elementary question. :rose:

              N Offline
              N Offline
              Nemanja Trifunovic
              wrote on last edited by
              #13

              Aljechin wrote:

              char szSource[23] = {"Before\0After"}; char szDest[23]; ptr = memcpy(szDest,szSource,22); printf("%s %d",szDest,strlen(szDest));

              char szSource[23] = {"Before\0After"}; char szDest[23]; std::copy(szSource, szSource + 23, szDest); However, as Cedric already noted, don't expect that printf and strlen show the whole thing if you have embedded zeroes.


              My programming blahblahblah blog. If you ever find anything useful here, please let me know to remove it.

              C 1 Reply Last reply
              0
              • C color Aljechin

                char szSource[23] = {"Before\0After"}; char szDest[23]; ptr = memcpy(szDest,szSource,22); printf("%s %d",szDest,strlen(szDest)); Hi, may i please request you to just try this code and comment on why memcpy is failing? Is it the way it goes or am I wrong somewhere? Can you suggest some workaround? Thanks for your time. :rose:

                D Offline
                D Offline
                David Crow
                wrote on last edited by
                #14

                Aljechin wrote:

                ptr = memcpy(szDest,szSource,22);

                Use 12 instead.

                Aljechin wrote:

                printf("%s %d",szDest,strlen(szDest));

                This is highly dependent on szDest being nul-terminated. Using memcpy() implies that you are not treating it as a nul-terminated string.


                "The largest fire starts but with the smallest spark." - David Crow

                C 1 Reply Last reply
                0
                • D David Crow

                  Aljechin wrote:

                  ptr = memcpy(szDest,szSource,22);

                  Use 12 instead.

                  Aljechin wrote:

                  printf("%s %d",szDest,strlen(szDest));

                  This is highly dependent on szDest being nul-terminated. Using memcpy() implies that you are not treating it as a nul-terminated string.


                  "The largest fire starts but with the smallest spark." - David Crow

                  C Offline
                  C Offline
                  color Aljechin
                  wrote on last edited by
                  #15

                  Thank you so much. :rose:

                  1 Reply Last reply
                  0
                  • N Nemanja Trifunovic

                    Aljechin wrote:

                    char szSource[23] = {"Before\0After"}; char szDest[23]; ptr = memcpy(szDest,szSource,22); printf("%s %d",szDest,strlen(szDest));

                    char szSource[23] = {"Before\0After"}; char szDest[23]; std::copy(szSource, szSource + 23, szDest); However, as Cedric already noted, don't expect that printf and strlen show the whole thing if you have embedded zeroes.


                    My programming blahblahblah blog. If you ever find anything useful here, please let me know to remove it.

                    C Offline
                    C Offline
                    color Aljechin
                    wrote on last edited by
                    #16

                    Thank you so much. I will try this. :rose:

                    1 Reply Last reply
                    0
                    • C Cedric Moonen

                      So, what is the problem ? Your data is there but if you try to display it with a function that waits for a string, you won't be able to see past the zero char. Just send your buffer and it will work. You need to remember the size of your string of course because strlen won't work.


                      Cédric Moonen Software developer
                      Charting control

                      C Offline
                      C Offline
                      color Aljechin
                      wrote on last edited by
                      #17

                      Thank you very much

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups