STRCPY(3P)

πŸ’– PROLOG πŸ’–

Okay bestie, real talk before we get into it: this manual page is part of the POSIX Programmer's Manual. The Linux implementation of this interface may differ (so like, go check the corresponding Linux manual page for the deets on Linux behavior, fr), or the interface might not even be implemented on Linux at all. πŸ™ˆ

Also hi, welcome to the STRCPY(3P) page, from the POSIX Programmer's Manual β€” this is your girl's guide to copying strings. πŸ’…


✨ NAME ✨

stpcpy, strcpy β€” copy a string and return a pointer to the end of the result


πŸ¦‹ SYNOPSIS πŸ¦‹

#include <string.h>

char *stpcpy(char *restrict s1, const char *restrict s2);
char *strcpy(char *restrict s1, const char *restrict s2);

🌸 DESCRIPTION 🌸

Okay so for strcpy() specifically: the functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional β€” like, not on purpose at all. This volume of POSIX.1‐2017 defers to the ISO C standard. Periodt.

The stpcpy() and strcpy() functions shall copy the string pointed to by s2 (including the terminating NUL character) into the array pointed to by s1. Like, the whole thing, NUL and all. 🫢

If copying takes place between objects that overlap, the behavior is undefined. πŸ’€ Not "kinda weird", not "a little off" β€” undefined. Do not do this. Ever. I'm begging.

πŸ‘‘ RETURN VALUE πŸ‘‘

The stpcpy() function shall return a pointer to the terminating NUL character copied into the s1 buffer. So it hands you back the end of the string it just made, which is lowkey iconic for chaining. πŸ”₯

The strcpy() function shall return s1.

No return values are reserved to indicate an error. Like, there's no secret error code hiding in there. Nope.


πŸ’… ERRORS πŸ’…

No errors are defined.

The following sections are informative.


πŸŽ€ EXAMPLES πŸŽ€

🌈 Construction of a Multi-Part Message in a Single Buffer

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

int
main (void)
{
    char buffer [10];
    char *name = buffer;

    name = stpcpy (stpcpy (stpcpy (name, "ice"),"-"), "cream");
    puts (buffer);
    return 0;
}

Look at that nesting though β€” stpcpy returning the end pointer means you can just chain them together and build "ice-cream" one piece at a time. Main character behavior honestly. πŸ“

🌈 Initializing a String

The following example copies the string "----------" into the permstring variable.

#include <string.h>
...
static char permstring[11];
...
strcpy(permstring, "----------");
...

Ten dashes, eleven bytes of array, one very satisfied NUL. ✨

🌈 Storing a Key and Data

The following example allocates space for a key using malloc() then uses strcpy() to place the key there. Then it allocates space for data using malloc(), and uses strcpy() to place data there. (The user-defined function dbfree() frees memory previously allocated to an array of type struct element *.)

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
...
/* Structure used to read data and store it. */
struct element {
    char *key;
    char *data;
};

struct element *tbl, *curtbl;
char *key, *data;
int count;
...
void dbfree(struct element *, int);
...
if ((curtbl->key = malloc(strlen(key) + 1)) == NULL) {
    perror("malloc"); dbfree(tbl, count); return NULL;
}
strcpy(curtbl->key, key);

if ((curtbl->data = malloc(strlen(data) + 1)) == NULL) {
    perror("malloc"); free(curtbl->key); dbfree(tbl, count); return NULL;
}
strcpy(curtbl->data, data);
...

Notice the strlen(...) + 1 β€” that + 1 is for the NUL bestie, don't forget it or it's giving buffer overflow. 😭


🧚 APPLICATION USAGE 🧚

Character movement is performed differently in different implementations. So like, overlapping moves may yield surprises. 🫠 (See above re: undefined behavior. Same energy.)

This version is aligned with the ISO C standard; this does not affect compatibility with XPG3 applications. Reliable error detection by this function was never guaranteed. Ngl, it just never was.


πŸ’œ RATIONALE πŸ’œ

None.


⭐ FUTURE DIRECTIONS ⭐

None.


πŸ”₯ SEE ALSO πŸ”₯

  • strncpy()
  • wcscpy()

The Base Definitions volume of POSIX.1‐2017, <string.h>


Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1-2017, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 7, 2018 Edition, Copyright (C) 2018 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html .

Any typographical or formatting errors that appear in this page are most likely to have been introduced during the conversion of the source files to man page format. To report such errors, see https://www.kernel.org/doc/man-pages/reporting_bugs.html .


And that's the whole page bestie β€” brought to you by IEEE/The Open Group, dated 2017, filed under STRCPY(3P). Slay, go copy some strings safely. πŸ’…βœ¨πŸ¦‹

πŸ“¦ where this page comes from