C pointers: copy strings












1















I am trying to copy the string contained in



char *src 


into



char *dst


this is my function but doesn't compile



char *mystrncpy(char *dst, char *src, size_t len)
{
char *temp = dst;

char *p = dst;
size_t i = 0;
for (p = dst; i < len; p += 1)
{
*p = *(src + p);
i += 1;
}

return *temp;
}









share|improve this question

























  • *p = *(src + p); shouldn't that be something among the lines of *p = *(src + i); instead?

    – Blaze
    Nov 22 '18 at 14:55











  • yes it does compile but doesn't do what expected

    – cucklordv4
    Nov 22 '18 at 14:58






  • 1





    what is the purpose of p < src ?

    – Brice
    Nov 22 '18 at 15:03






  • 1





    If it does not compile you should include the error message in the question.

    – Broman
    Nov 22 '18 at 15:03






  • 2





    The behavior of p < src is not defined by the C standard. You should not compare pointers from different objects for order. (Pointers may be compared for equality. Pointers within one object, such as an array or structure, may be compared for order.) Nor is there any reason to do such a comparison; the function is apparently designed to copy len characters, so only len is needed to control the loop.

    – Eric Postpischil
    Nov 22 '18 at 15:08
















1















I am trying to copy the string contained in



char *src 


into



char *dst


this is my function but doesn't compile



char *mystrncpy(char *dst, char *src, size_t len)
{
char *temp = dst;

char *p = dst;
size_t i = 0;
for (p = dst; i < len; p += 1)
{
*p = *(src + p);
i += 1;
}

return *temp;
}









share|improve this question

























  • *p = *(src + p); shouldn't that be something among the lines of *p = *(src + i); instead?

    – Blaze
    Nov 22 '18 at 14:55











  • yes it does compile but doesn't do what expected

    – cucklordv4
    Nov 22 '18 at 14:58






  • 1





    what is the purpose of p < src ?

    – Brice
    Nov 22 '18 at 15:03






  • 1





    If it does not compile you should include the error message in the question.

    – Broman
    Nov 22 '18 at 15:03






  • 2





    The behavior of p < src is not defined by the C standard. You should not compare pointers from different objects for order. (Pointers may be compared for equality. Pointers within one object, such as an array or structure, may be compared for order.) Nor is there any reason to do such a comparison; the function is apparently designed to copy len characters, so only len is needed to control the loop.

    – Eric Postpischil
    Nov 22 '18 at 15:08














1












1








1








I am trying to copy the string contained in



char *src 


into



char *dst


this is my function but doesn't compile



char *mystrncpy(char *dst, char *src, size_t len)
{
char *temp = dst;

char *p = dst;
size_t i = 0;
for (p = dst; i < len; p += 1)
{
*p = *(src + p);
i += 1;
}

return *temp;
}









share|improve this question
















I am trying to copy the string contained in



char *src 


into



char *dst


this is my function but doesn't compile



char *mystrncpy(char *dst, char *src, size_t len)
{
char *temp = dst;

char *p = dst;
size_t i = 0;
for (p = dst; i < len; p += 1)
{
*p = *(src + p);
i += 1;
}

return *temp;
}






c string pointers






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 22 '18 at 15:20







cucklordv4

















asked Nov 22 '18 at 14:53









cucklordv4cucklordv4

113




113













  • *p = *(src + p); shouldn't that be something among the lines of *p = *(src + i); instead?

    – Blaze
    Nov 22 '18 at 14:55











  • yes it does compile but doesn't do what expected

    – cucklordv4
    Nov 22 '18 at 14:58






  • 1





    what is the purpose of p < src ?

    – Brice
    Nov 22 '18 at 15:03






  • 1





    If it does not compile you should include the error message in the question.

    – Broman
    Nov 22 '18 at 15:03






  • 2





    The behavior of p < src is not defined by the C standard. You should not compare pointers from different objects for order. (Pointers may be compared for equality. Pointers within one object, such as an array or structure, may be compared for order.) Nor is there any reason to do such a comparison; the function is apparently designed to copy len characters, so only len is needed to control the loop.

    – Eric Postpischil
    Nov 22 '18 at 15:08



















  • *p = *(src + p); shouldn't that be something among the lines of *p = *(src + i); instead?

    – Blaze
    Nov 22 '18 at 14:55











  • yes it does compile but doesn't do what expected

    – cucklordv4
    Nov 22 '18 at 14:58






  • 1





    what is the purpose of p < src ?

    – Brice
    Nov 22 '18 at 15:03






  • 1





    If it does not compile you should include the error message in the question.

    – Broman
    Nov 22 '18 at 15:03






  • 2





    The behavior of p < src is not defined by the C standard. You should not compare pointers from different objects for order. (Pointers may be compared for equality. Pointers within one object, such as an array or structure, may be compared for order.) Nor is there any reason to do such a comparison; the function is apparently designed to copy len characters, so only len is needed to control the loop.

    – Eric Postpischil
    Nov 22 '18 at 15:08

















*p = *(src + p); shouldn't that be something among the lines of *p = *(src + i); instead?

– Blaze
Nov 22 '18 at 14:55





*p = *(src + p); shouldn't that be something among the lines of *p = *(src + i); instead?

– Blaze
Nov 22 '18 at 14:55













yes it does compile but doesn't do what expected

– cucklordv4
Nov 22 '18 at 14:58





yes it does compile but doesn't do what expected

– cucklordv4
Nov 22 '18 at 14:58




1




1





what is the purpose of p < src ?

– Brice
Nov 22 '18 at 15:03





what is the purpose of p < src ?

– Brice
Nov 22 '18 at 15:03




1




1





If it does not compile you should include the error message in the question.

– Broman
Nov 22 '18 at 15:03





If it does not compile you should include the error message in the question.

– Broman
Nov 22 '18 at 15:03




2




2





The behavior of p < src is not defined by the C standard. You should not compare pointers from different objects for order. (Pointers may be compared for equality. Pointers within one object, such as an array or structure, may be compared for order.) Nor is there any reason to do such a comparison; the function is apparently designed to copy len characters, so only len is needed to control the loop.

– Eric Postpischil
Nov 22 '18 at 15:08





The behavior of p < src is not defined by the C standard. You should not compare pointers from different objects for order. (Pointers may be compared for equality. Pointers within one object, such as an array or structure, may be compared for order.) Nor is there any reason to do such a comparison; the function is apparently designed to copy len characters, so only len is needed to control the loop.

– Eric Postpischil
Nov 22 '18 at 15:08












2 Answers
2






active

oldest

votes


















3














You're overdoing it.



You probably want this:



char *mystrncpy(char *dst, char *src, size_t len)
{
while (len > 0)
{
*dst++ = *src++;
len--;
}

return dst - len;
}


This is totally wrong



return *temp;


*temp is a char an not a pointer so return temp; would be correct.



BTW: strictly speaking we are not copying a string as a string in C is a NUL terminated sequence of chars. Here we are just copying len bytes.






share|improve this answer


























  • my function needs to return the dst string

    – cucklordv4
    Nov 22 '18 at 15:10











  • I think i should do return dst; (is it correct?)

    – cucklordv4
    Nov 22 '18 at 15:11








  • 1





    @cucklordv4 not quite, consider what the ++ is doing to dst.

    – Jabberwocky
    Nov 22 '18 at 15:11






  • 1





    @Jabberwocky Pointer arithmetic with len will work as well.

    – Govind Parmar
    Nov 22 '18 at 15:18






  • 1





    @GovindParmar sure, there are different possibilities.

    – Jabberwocky
    Nov 22 '18 at 15:18



















2














You are really close; your error is on this line:



*p = *(src + p);


Think about why you are dereferencing *(src + p)... remember, where is the memory location of the character you're trying to copy?



Also your function should either return void since there's no return statement anywhere, or return dst. Also, you don't need p < src in your loop guard.






share|improve this answer


























  • why I don't need p < src ?

    – cucklordv4
    Nov 22 '18 at 15:06






  • 1





    @cucklordv4 other question: why do you think you need it?

    – Jabberwocky
    Nov 22 '18 at 15:07











  • Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

    – Eric Postpischil
    Nov 22 '18 at 15:07











  • @EricPostpischil Updated my answer.

    – Govind Parmar
    Nov 22 '18 at 15:08











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53433538%2fc-pointers-copy-strings%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









3














You're overdoing it.



You probably want this:



char *mystrncpy(char *dst, char *src, size_t len)
{
while (len > 0)
{
*dst++ = *src++;
len--;
}

return dst - len;
}


This is totally wrong



return *temp;


*temp is a char an not a pointer so return temp; would be correct.



BTW: strictly speaking we are not copying a string as a string in C is a NUL terminated sequence of chars. Here we are just copying len bytes.






share|improve this answer


























  • my function needs to return the dst string

    – cucklordv4
    Nov 22 '18 at 15:10











  • I think i should do return dst; (is it correct?)

    – cucklordv4
    Nov 22 '18 at 15:11








  • 1





    @cucklordv4 not quite, consider what the ++ is doing to dst.

    – Jabberwocky
    Nov 22 '18 at 15:11






  • 1





    @Jabberwocky Pointer arithmetic with len will work as well.

    – Govind Parmar
    Nov 22 '18 at 15:18






  • 1





    @GovindParmar sure, there are different possibilities.

    – Jabberwocky
    Nov 22 '18 at 15:18
















3














You're overdoing it.



You probably want this:



char *mystrncpy(char *dst, char *src, size_t len)
{
while (len > 0)
{
*dst++ = *src++;
len--;
}

return dst - len;
}


This is totally wrong



return *temp;


*temp is a char an not a pointer so return temp; would be correct.



BTW: strictly speaking we are not copying a string as a string in C is a NUL terminated sequence of chars. Here we are just copying len bytes.






share|improve this answer


























  • my function needs to return the dst string

    – cucklordv4
    Nov 22 '18 at 15:10











  • I think i should do return dst; (is it correct?)

    – cucklordv4
    Nov 22 '18 at 15:11








  • 1





    @cucklordv4 not quite, consider what the ++ is doing to dst.

    – Jabberwocky
    Nov 22 '18 at 15:11






  • 1





    @Jabberwocky Pointer arithmetic with len will work as well.

    – Govind Parmar
    Nov 22 '18 at 15:18






  • 1





    @GovindParmar sure, there are different possibilities.

    – Jabberwocky
    Nov 22 '18 at 15:18














3












3








3







You're overdoing it.



You probably want this:



char *mystrncpy(char *dst, char *src, size_t len)
{
while (len > 0)
{
*dst++ = *src++;
len--;
}

return dst - len;
}


This is totally wrong



return *temp;


*temp is a char an not a pointer so return temp; would be correct.



BTW: strictly speaking we are not copying a string as a string in C is a NUL terminated sequence of chars. Here we are just copying len bytes.






share|improve this answer















You're overdoing it.



You probably want this:



char *mystrncpy(char *dst, char *src, size_t len)
{
while (len > 0)
{
*dst++ = *src++;
len--;
}

return dst - len;
}


This is totally wrong



return *temp;


*temp is a char an not a pointer so return temp; would be correct.



BTW: strictly speaking we are not copying a string as a string in C is a NUL terminated sequence of chars. Here we are just copying len bytes.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 22 '18 at 15:25

























answered Nov 22 '18 at 15:09









JabberwockyJabberwocky

27.7k93773




27.7k93773













  • my function needs to return the dst string

    – cucklordv4
    Nov 22 '18 at 15:10











  • I think i should do return dst; (is it correct?)

    – cucklordv4
    Nov 22 '18 at 15:11








  • 1





    @cucklordv4 not quite, consider what the ++ is doing to dst.

    – Jabberwocky
    Nov 22 '18 at 15:11






  • 1





    @Jabberwocky Pointer arithmetic with len will work as well.

    – Govind Parmar
    Nov 22 '18 at 15:18






  • 1





    @GovindParmar sure, there are different possibilities.

    – Jabberwocky
    Nov 22 '18 at 15:18



















  • my function needs to return the dst string

    – cucklordv4
    Nov 22 '18 at 15:10











  • I think i should do return dst; (is it correct?)

    – cucklordv4
    Nov 22 '18 at 15:11








  • 1





    @cucklordv4 not quite, consider what the ++ is doing to dst.

    – Jabberwocky
    Nov 22 '18 at 15:11






  • 1





    @Jabberwocky Pointer arithmetic with len will work as well.

    – Govind Parmar
    Nov 22 '18 at 15:18






  • 1





    @GovindParmar sure, there are different possibilities.

    – Jabberwocky
    Nov 22 '18 at 15:18

















my function needs to return the dst string

– cucklordv4
Nov 22 '18 at 15:10





my function needs to return the dst string

– cucklordv4
Nov 22 '18 at 15:10













I think i should do return dst; (is it correct?)

– cucklordv4
Nov 22 '18 at 15:11







I think i should do return dst; (is it correct?)

– cucklordv4
Nov 22 '18 at 15:11






1




1





@cucklordv4 not quite, consider what the ++ is doing to dst.

– Jabberwocky
Nov 22 '18 at 15:11





@cucklordv4 not quite, consider what the ++ is doing to dst.

– Jabberwocky
Nov 22 '18 at 15:11




1




1





@Jabberwocky Pointer arithmetic with len will work as well.

– Govind Parmar
Nov 22 '18 at 15:18





@Jabberwocky Pointer arithmetic with len will work as well.

– Govind Parmar
Nov 22 '18 at 15:18




1




1





@GovindParmar sure, there are different possibilities.

– Jabberwocky
Nov 22 '18 at 15:18





@GovindParmar sure, there are different possibilities.

– Jabberwocky
Nov 22 '18 at 15:18













2














You are really close; your error is on this line:



*p = *(src + p);


Think about why you are dereferencing *(src + p)... remember, where is the memory location of the character you're trying to copy?



Also your function should either return void since there's no return statement anywhere, or return dst. Also, you don't need p < src in your loop guard.






share|improve this answer


























  • why I don't need p < src ?

    – cucklordv4
    Nov 22 '18 at 15:06






  • 1





    @cucklordv4 other question: why do you think you need it?

    – Jabberwocky
    Nov 22 '18 at 15:07











  • Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

    – Eric Postpischil
    Nov 22 '18 at 15:07











  • @EricPostpischil Updated my answer.

    – Govind Parmar
    Nov 22 '18 at 15:08
















2














You are really close; your error is on this line:



*p = *(src + p);


Think about why you are dereferencing *(src + p)... remember, where is the memory location of the character you're trying to copy?



Also your function should either return void since there's no return statement anywhere, or return dst. Also, you don't need p < src in your loop guard.






share|improve this answer


























  • why I don't need p < src ?

    – cucklordv4
    Nov 22 '18 at 15:06






  • 1





    @cucklordv4 other question: why do you think you need it?

    – Jabberwocky
    Nov 22 '18 at 15:07











  • Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

    – Eric Postpischil
    Nov 22 '18 at 15:07











  • @EricPostpischil Updated my answer.

    – Govind Parmar
    Nov 22 '18 at 15:08














2












2








2







You are really close; your error is on this line:



*p = *(src + p);


Think about why you are dereferencing *(src + p)... remember, where is the memory location of the character you're trying to copy?



Also your function should either return void since there's no return statement anywhere, or return dst. Also, you don't need p < src in your loop guard.






share|improve this answer















You are really close; your error is on this line:



*p = *(src + p);


Think about why you are dereferencing *(src + p)... remember, where is the memory location of the character you're trying to copy?



Also your function should either return void since there's no return statement anywhere, or return dst. Also, you don't need p < src in your loop guard.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 22 '18 at 15:08

























answered Nov 22 '18 at 15:01









Govind ParmarGovind Parmar

12.2k53462




12.2k53462













  • why I don't need p < src ?

    – cucklordv4
    Nov 22 '18 at 15:06






  • 1





    @cucklordv4 other question: why do you think you need it?

    – Jabberwocky
    Nov 22 '18 at 15:07











  • Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

    – Eric Postpischil
    Nov 22 '18 at 15:07











  • @EricPostpischil Updated my answer.

    – Govind Parmar
    Nov 22 '18 at 15:08



















  • why I don't need p < src ?

    – cucklordv4
    Nov 22 '18 at 15:06






  • 1





    @cucklordv4 other question: why do you think you need it?

    – Jabberwocky
    Nov 22 '18 at 15:07











  • Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

    – Eric Postpischil
    Nov 22 '18 at 15:07











  • @EricPostpischil Updated my answer.

    – Govind Parmar
    Nov 22 '18 at 15:08

















why I don't need p < src ?

– cucklordv4
Nov 22 '18 at 15:06





why I don't need p < src ?

– cucklordv4
Nov 22 '18 at 15:06




1




1





@cucklordv4 other question: why do you think you need it?

– Jabberwocky
Nov 22 '18 at 15:07





@cucklordv4 other question: why do you think you need it?

– Jabberwocky
Nov 22 '18 at 15:07













Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

– Eric Postpischil
Nov 22 '18 at 15:07





Rather than changing the type to return void, the intent may have been that the function returns the destination, as the standard strncpy does.

– Eric Postpischil
Nov 22 '18 at 15:07













@EricPostpischil Updated my answer.

– Govind Parmar
Nov 22 '18 at 15:08





@EricPostpischil Updated my answer.

– Govind Parmar
Nov 22 '18 at 15:08


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53433538%2fc-pointers-copy-strings%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown