In this tutorial, you will learn what is strncpy_s and how to use strncpy_s in C programming. I have already written the blog post on why strncpy is unsafe?. If you want, you can also read this blog post it helps you understand why strncpy_s is introduced by the C standard. So let’s understand what is strncpy_s and how to use it in C programming.
What is strncpy_s?
The strncpy_s function introduces in C11. It copies characters of one string to another similar to the strncpy function.
The strncpy_s function copies not more than n successive characters (characters that follow a null character are not copied) from the array pointed to by s2 (Source Buffer) to the array pointed to by s1(Destination buffer). If no null character was copied from s2 , then s1[n] is set to a null character.
Syntax of strncpy_s():
errno_t strncpy_s(char * restrict s1,
rsize_t s1max,
const char * restrict s2,
rsize_t n);
Parameters:
s1 :- Pointer to the destination array where the content is to be copied.
s1max :- The size of the destination buffer.
s2 :- It is a pointer to the source array that will be copied.
n :- The first n character copied from src to dest.
Return:
The strncpy_s function returns zero on success, returns non-zero on error.
Example of strncpy_s in C:
The following example program shows how we can use stncpy_s in our code. You must remember your compiler should support ISO-C11.
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
char src[] = "Aticleworld.com";
// The destination string size is 16.
char dest[16] = {0};
// copying 12 bytes of src into dest.
strncpy_s(dest, sizeof(dest), src, 12);
printf("Copied string: %s\n", dest);
return 0;
}
Important points related to the strncpy_s function:
1. If n (count) is less than the length of s2 (source array) or if there was no null in the source array, then it writes a null character to s1[n]. It can be used to copy a string without the danger that the result will not be a null-terminated array.
Consider the below example when the length of n is 4 which is less than the length of the src array.
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
//source array
char src[7] = {'g', 'o', 'o', 'd', 'b', 'y', 'e'};
// The destination array size is 5.
char dest[5];
/*
Call will assign to r the value
zero and to dst the sequence good\0.
*/
errno_t r = strncpy_s(dest, 5, src, 4);
printf("Copied string: %s\n", dest);
return 0;
}
Output:
good\0
2.Unlike strncpy, if n (count) is greater than the length of s2 (source array), the destination string is not padded with null characters up to length n.
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
//source array
char src[12] = "Goodbye";
// The destination array size is 20.
char dest[20];
/*
Call will assign to r the value
zero and to dst the sequence Goodbye\0.
*/
errno_t r = strncpy_s(dest, 20, src, 12);
printf("Copied string: %s\n", dest);
return 0;
}
Output:
Goodbye\0
3.The strncpy_s function also avoids the overflow issue (characters will not be written end of the destination array).
Consider the below example we will get the non-zero value from strncpy_s because we trying to cross the boundary of the destination array.
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
//source array
char src[7] = {'g', 'o', 'o', 'd', 'b', 'y', 'e'};
// The destination array size is 10.
char dest[5];
/*
Copy will be overflow, So call will assign to r a nonzero
value and to dst the sequence \0.
*/
errno_t r = strncpy_s(dest, 5, src, 7);//>> return non-zero value
return 0;
}
4. The behavior of strncpy_s is undefined if the source and destination strings overlap.
Following are the Runtime-constraints, you must remember:
- s1 or s2 must not be a null pointer.
- s1 and s2 must not be overlapped.
- n is not greater than RSIZE_MAX.
- s1max is must not be zero or greater than RSIZE_MAX.
- If n is not less than s1max, then s1max shall be greater than
strnlen_s(s2, s1max). Consider the below example,
Example_1: Ok char src1[100] = "hello"; char dst1[6]; int r1 = strncpy_s(dst1, 6, src1, 100); Example_2: Error char src1[4] = "Hi"; char dst1[6]; int r1 = strncpy_s(dst1, 6, src1, 100);
Note: If there is a runtime-constraint violation, then if s1 is not a null pointer and s1max is greater than 0 and not greater than RSIZE_MAX, then strncpy_s sets s1[0] to the null character.
Recommended Articles for you:
- C Programming Courses And Tutorials.
- CPP Programming Courses And Tutorials.
- Why strncpy is not safe and how to fix it
- How to make own memmove function in C.
- Difference between memmove and memcpy (memmove vs memcpy).
- How to make memcpy function in C.
- Use of strlen function in C.
- strtok function with programming examples.
- strcat function in C with examples code.
- How to use and Implement own strncat in C