简体   繁体   中英

Difference between strncpy and memcpy?

How can I access s[7] in s ?

I didn't observe any difference between strncpy and memcpy . If I want to print the output s , along with s[7] (like qwertyA ), what are the changes I have to made in the following code:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char s[10] = "qwerty", str[10], str1[10];
    s[7] = 'A';
    printf("%s\n", s);
    strncpy(str, s, 8);
    printf("%s\n", str);
    memcpy(str1, s, 8);
    printf("%s\n", str1);
    return 0;
}

Output:

qwerty
qwerty
qwerty

Others have pointed out your null-termination problems. You need to understand null-termination before you understand the difference between memcpy and strncpy .

The main difference is that memcpy will copy all N characters you ask for, while strncpy will copy up to the first null terminator inclusive, or N characters, whichever is fewer .

In the event that it copies less than N characters, it will pad the rest out with null characters.

You are getting the output querty because the index 7 is incorrect (arrays are indexed from 0, not 1). There is a null-terminator at index 6 to signal the end of the string, and whatever comes after it will have no effect.

Two things you need to fix:

  1. Change the 7 in s[7] to 6
  2. Add a null-terminator at s[7]

The result will be:

char s[10] = "qwerty";
s[6] = 'A';
s[7] = 0;

Original not working and fixed working .

As for the question of strncpy versus memcpy , the difference is that strncpy adds a null-terminator for you. BUT, only if the source string has one before n . So strncpy is what you want to use here, but be very careful of the big BUT.

Strncpy will copy up to NULL even you specified the number of bytes to copy , but memcpy will copy up to specified number of bytes .

printf statement will print up to NULL , so you will try to print a single charater , it will show ,

printf("\t%c %c %c\t",s[7],str[7],str1[7]);

OUTPUT

  7              7

To make "qwertyA" you need to set s[6] = 'A' and s[7]='\\0'

Strings are indexed from 0, so s[0] == 'q' , and they need to be null terminated.

When you have:

char s[10] = "qwerty";

this is what that array contains:

s[0]  'q'
s[1]  'w'
s[2]  'e'
s[3]  'r'
s[4]  't'
s[5]  'y'
s[6]   0
s[7]   0
s[8]   0
s[9]   0

If you want to add an 'A' to the end of your string, that's at index 6, since array indexes start at 0

 s[6] = 'A';

Note that when you initialize an array this way, the remaining space is set to 0 (a nul terminator), While not needed in this case, generally be aware that you need to make your strings nul terminated. eg

char s[10];
strcpy(s,"qwerty");
s[6] = 'A';
s[7] = 0;

In the above example "qwerty" , including its nul terminator is copied to s . s[6] overwrites that nul terminator. Since the rest of s is not initialized we need to add a nul terminator ourselves with s[7] = 0;

As explained by Philip Potter, The main difference is that memcpy will copy all N characters you ask for, while strncpy will copy up to the first null terminator inclusive, or N characters, whichever is fewer. In the event that it copies less than N characters, it will pad the rest out with null characters. Execute the below code and check the difference, you might find it useful. Thanks.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char s[10] = "qwer\0ty", str[10], str1[10];
    s[7] = 'A';
    printf("%s\n",s);
    strncpy(str,s,8);
    printf("%s\n",str);
    memcpy(str1,s,8);
    printf("%s\n",str1);
    for(int i = 0; i<8; i++)
    {
        printf("%d=%c,",i,str[i]);
    }
    printf("\n");
    for(int i = 0; i<8; i++)
    {
        printf("%d=%c,",i,str1[i]);
    }
    return 0;
}

Output:

qwer
qwer
qwer
0=q,1=w,2=e,3=r,4=,5=,6=,7=,
0=q,1=w,2=e,3=r,4=,5=t,6=y,7=A,

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM