The strcpy() function copies a string from source to destination, including the null terminator \0. It is defined in the <string.h> header.
Basic Syntax
#include <string.h> char *strcpy(char *destination, const char *source);
| Parameter | Description |
|---|---|
destination | Pointer to destination array (must be large enough) |
source | Pointer to source string to copy |
| Return value | Pointer to destination (useful for chaining) |
Example 1: Basic String Copy
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello World";
char destination[20]; // Must be large enough
strcpy(destination, source);
printf("Source: %s\n", source);
printf("Destination: %s\n", destination);
return 0;
}
Output:
Source: Hello World Destination: Hello World
Example 2: Copying Partial Strings
#include <stdio.h>
#include <string.h>
int main() {
char text[] = "Programming in C";
char buffer[30];
// Copy entire string
strcpy(buffer, text);
printf("Full copy: %s\n", buffer);
// Copy from specific position using pointer arithmetic
strcpy(buffer, text + 4); // Starts at position 4 ( 'r' )
printf("From index 4: %s\n", buffer);
// buffer now contains "ramming in C"
return 0;
}
Output:
Full copy: Programming in C From index 4: ramming in C
Example 3: Chaining strcpy Calls
#include <stdio.h>
#include <string.h>
int main() {
char first[20];
char second[20];
char third[20];
// strcpy returns destination, allowing chaining
strcpy(third, strcpy(second, strcpy(first, "Chain")));
printf("First: %s\n", first);
printf("Second: %s\n", second);
printf("Third: %s\n", third);
return 0;
}
Output:
First: Chain Second: Chain Third: Chain
Example 4: Copying Between Arrays
#include <stdio.h>
#include <string.h>
int main() {
char name1[] = "Alice Johnson";
char name2[50];
char name3[50];
// Copy to another array
strcpy(name2, name1);
// Copy to itself is undefined behavior (don't do it)
// strcpy(name1, name1); // ❌ BAD - Overlapping memory
// Modify original
strcpy(name1, "Bob Smith");
printf("Original: %s\n", name1);
printf("Copied (before): %s\n", name2);
// Copy again
strcpy(name3, name2);
printf("Second copy: %s\n", name3);
return 0;
}
Output:
Original: Bob Smith Copied (before): Alice Johnson Second copy: Alice Johnson
Example 5: Building Strings with strcpy and strcat
#include <stdio.h>
#include <string.h>
int main() {
char greeting[100];
char name[] = "John";
char exclamation[] = "!";
// Build: "Hello " + "John" + "!"
strcpy(greeting, "Hello ");
strcat(greeting, name);
strcat(greeting, exclamation);
printf("%s\n", greeting);
// Alternative using chaining
char message[100];
strcpy(strcpy(message, "Welcome, "), "Alice");
printf("%s\n", message);
return 0;
}
Output:
Hello John! Welcome, Alice
Example 6: Copying String Literals
#include <stdio.h>
#include <string.h>
int main() {
char buffer[100];
// Copy string literal directly
strcpy(buffer, "Direct string literal");
printf("%s\n", buffer);
// Copy from const char* pointer
const char *msg = "Pointer to string";
strcpy(buffer, msg);
printf("%s\n", buffer);
// Copy multiple times (overwrites previous)
strcpy(buffer, "New content");
strcpy(buffer, "Overwritten again");
printf("%s\n", buffer);
return 0;
}
Output:
Direct string literal Pointer to string Overwritten again
The Danger: Buffer Overflow
#include <stdio.h>
#include <string.h>
int main() {
char small[5]; // Only 5 bytes capacity
// ❌ DANGEROUS - Source is larger than destination
// This will overflow and cause undefined behavior
char large[] = "This is too long";
// strcpy(small, large); // CRASH or memory corruption!
// ✅ SAFE - Use strncpy or ensure size
char safe[50];
strcpy(safe, large); // Safe because safe[] is large enough
printf("%s\n", safe);
return 0;
}
strcpy vs strncpy (Safe Alternative)
#include <stdio.h>
#include <string.h>
int main() {
char dest[10];
char src[] = "This is a very long string";
// strcpy - UNSAFE (will overflow)
// strcpy(dest, src); // ❌ DON'T DO THIS
// strncpy - SAFER (copies max n characters)
strncpy(dest, src, sizeof(dest) - 1); // Copy 9 chars
dest[sizeof(dest) - 1] = '\0'; // Manually add null terminator
printf("Copied: %s\n", dest);
// Note: strncpy doesn't add null terminator if src >= n
char dest2[5] = "XXXX";
strncpy(dest2, "Hi", 3);
printf("strncpy result: %s\n", dest2); // "Hi" + null
return 0;
}
Output:
Copied: This is a strncpy result: Hi
Comparison Table
| Function | Copies Null Terminator? | Bounds Checked? | Use Case |
|---|---|---|---|
strcpy(dest, src) | Yes | No | When dest size is guaranteed |
strncpy(dest, src, n) | Only if src shorter than n | Yes | Limited copy (may need manual null) |
strcpy_s(dest, size, src) (C11) | Yes | Yes | Safe version (optional in C11) |
Common Mistakes
// ❌ WRONG - Destination too small char dest[5]; char src[] = "Hello World"; strcpy(dest, src); // Overflow! // ✅ CORRECT - Ensure destination is large enough char dest[50]; strcpy(dest, src); // ❌ WRONG - Uninitialized destination char *dest; // Points to random memory strcpy(dest, "text"); // CRASH // ✅ CORRECT - Use array or malloc char dest[20]; char *ptr = malloc(20); strcpy(ptr, "text"); // ❌ WRONG - Overlapping memory char str[20] = "Hello"; strcpy(str + 1, str); // Undefined behavior // ✅ CORRECT - Use memmove for overlapping memmove(str + 1, str, 6); // Safe overlapping copy
Practical Example: String Array Copy
#include <stdio.h>
#include <string.h>
int main() {
char original[5][20] = {
"Apple",
"Banana",
"Cherry",
"Date",
"Elderberry"
};
char copy[5][20];
// Copy entire array of strings
for(int i = 0; i < 5; i++) {
strcpy(copy[i], original[i]);
}
// Modify original
strcpy(original[0], "Apricot");
strcpy(original[1], "Blueberry");
printf("Original:\n");
for(int i = 0; i < 5; i++) {
printf(" %s\n", original[i]);
}
printf("\nCopy (unchanged):\n");
for(int i = 0; i < 5; i++) {
printf(" %s\n", copy[i]);
}
return 0;
}
Output:
Original: Apricot Blueberry Cherry Date Elderberry Copy (unchanged): Apple Banana Cherry Date Elderberry
Return Value Usage
#include <stdio.h>
#include <string.h>
int main() {
char buffer[100];
int length;
// strcpy returns pointer to destination
char *result = strcpy(buffer, "Hello");
// Check if success (always returns dest unless error)
if(result == buffer) {
printf("Copy successful\n");
}
// Can use return value in expressions
length = strlen(strcpy(buffer, "New string"));
printf("Length of '%s' is %d\n", buffer, length);
return 0;
}
Output:
Copy successful Length of 'New string' is 10
Quick Summary
| Operation | Code | Notes |
|---|---|---|
| Basic copy | strcpy(dest, src) | dest must be large enough |
| Safe copy | strncpy(dest, src, size-1); dest[size-1]=0 | Always null terminate |
| Copy literal | strcpy(dest, "text") | Works directly |
| Chain copies | strcpy(dest2, strcpy(dest1, src)) | Returns destination |
| Copy pointer content | strcpy(dest, ptr) | ptr must point to valid string |
Best Practice Rules
- Always ensure destination is large enough for source + null terminator
- Use
strncpy()for safety when size isn't guaranteed - Manually add null terminator after
strncpy()if needed - Never use
strcpy()with user input without validation - Never copy between overlapping strings (use
memmove()) - C11's
strcpy_s()is safe but not universally available
Complete C Programming Guide + Compilers Collection
1. C srand() Function – Understanding Seed Initialization
https://macronepal.com/understanding-the-c-srand-function
Explains how srand() initializes the pseudo-random number generator in C by setting a seed value. Using the same seed produces the same sequence, while time(NULL) gives different results each run.
2. C rand() Function Mechanics and Limitations
https://macronepal.com/c-rand-function-mechanics-and-limitations
Explains how rand() generates pseudo-random numbers between 0 and RAND_MAX, its deterministic nature, and limitations for security use cases.
3. C log() Function
https://macronepal.com/c-log-function-2
Covers natural logarithm calculation using <math.h> and its applications.
4. Mastering Date and Time in C
https://macronepal.com/mastering-date-and-time-in-c
Explains <time.h> functions like time(), clock(), difftime(), and struct tm.
5. Mastering time_t Type in C
https://macronepal.com/mastering-the-c-time_t-type-for-time-management
Explains time representation as seconds since Unix epoch and conversion functions.
6. C exp() Function
https://macronepal.com/c-exp-function-mechanics-and-implementation
Explains exponential function exp(x) and its scientific applications.
7. C log() Function (Alternate Guide)
https://macronepal.com/c-log-function
Comparison of log() and log10() with usage examples.
8. C log10() Function
https://macronepal.com/mastering-the-log10-function-in-c
Explains base-10 logarithm for engineering and scientific applications.
9. C tan() Function
https://macronepal.com/understanding-the-c-tan-function
Explains tangent function and radian-based calculations.
10. Random Numbers in C (Secure vs Predictable)
https://macronepal.com/mastering-c-random-numbers-for-secure-and-predictable-applications
Explains difference between rand() and secure randomness methods.
11. Free Online C Compiler
https://macronepal.com/free-online-c-code-compiler-2
Browser-based compiler for testing C programs instantly.
C Functions, Arguments, Parameters & Flow
Mastering Functions in C – Complete Guide
https://macronepal.com/c/mastering-functions-in-c-a-complete-guide/
Covers function structure, modular programming, and real-world usage.
Function Arguments in C
https://macronepal.com/c-function-arguments/
Explains how arguments are passed and used in function calls.
Function Parameters in C
https://macronepal.com/c-function-parameters/
Explains defining inputs for functions and matching them with arguments.
Function Declarations in C
https://macronepal.com/c-function-declarations-syntax-rules-and-best-practices/
Covers prototypes, syntax rules, and best practices.
Function Calls in C
https://macronepal.com/understanding-function-calls-in-c-syntax-mechanics-and-best-practices/
Explains execution flow and parameter handling during function calls.
Void Functions in C
https://macronepal.com/understanding-void-functions-in-c-syntax-patterns-and-best-practices/
Explains functions that do not return values.
Return Values in C
https://macronepal.com/c-return-values-mechanics-types-and-best-practices/
Explains different return types and how functions return results.
Pass-by-Value in C
https://macronepal.com/aws/understanding-pass-by-value-in-c-mechanics-implications-and-best-practices/
Explains how copies of variables are passed into functions.
Pass-by-Reference in C
https://macronepal.com/c/understanding-pass-by-reference-in-c-pointers-semantics-and-safe-practices/
Explains using pointers to modify original variables.
C strstr() Function
https://macronepal.com/aws/c-strstr-function/
Explains substring search inside strings in C.
C Preprocessor & Macros
https://macronepal.com/mastering-c-variadic-macros-for-flexible-debugging/
https://macronepal.com/mastering-the-stdc-macro-in-c/
https://macronepal.com/c-time-macro-mechanics-and-usage/
https://macronepal.com/understanding-the-c-date-macro/
https://macronepal.com/c-file-type/
https://macronepal.com/mastering-c-line-macro-for-debugging-and-diagnostics/
https://macronepal.com/mastering-predefined-macros-in-c/
https://macronepal.com/c-error-directive-mechanics-and-usage/
https://macronepal.com/understanding-the-c-pragma-directive/
https://macronepal.com/c-include-directive/
C Structures, Memory, Scope & Linkage
https://macronepal.com/mastering-structures-in-c/
https://macronepal.com/c-structure-declaration-mechanics-and-usage/
https://macronepal.com/c-structure-initialization-mechanics-and-best-practices/
https://macronepal.com/mastering-c-structure-member-access-for-reliable-data-handling/
https://macronepal.com/c-nested-structures/
https://macronepal.com/mastering-arrays-of-structures-in-c/
https://macronepal.com/c-structure-pointers-mechanics-and-implementation/
https://macronepal.com/understanding-c-structure-parameter-passing-mechanics/
https://macronepal.com/mastering-c-returning-structures-for-efficient-data-flow/
https://macronepal.com/c-self-referential-structures/
https://macronepal.com/mastering-structure-alignment-in-c/
https://macronepal.com/c-structure-padding-mechanics-and-optimization/
https://macronepal.com/understanding-c-flexible-array-members-mechanics-and-usage/
https://macronepal.com/mastering-c-anonymous-structures-for-flattened-data-layouts/
https://macronepal.com/c-unions/
https://macronepal.com/mastering-c-name-mangling-and-symbol-decoration/
https://macronepal.com/c-no-linkage-mechanics-and-scope-isolation/
https://macronepal.com/understanding-c-internal-linkage-mechanics-and-architecture/
C Scope, Storage Classes & Typedef
https://macronepal.com/mastering-function-prototype-scope-in-c/
https://macronepal.com/c-function-scope-mechanics-and-visibility/
https://macronepal.com/understanding-c-file-scope-mechanics-and-architecture/
https://macronepal.com/mastering-c-scope-rules-for-predictable-name-resolution/
https://macronepal.com/c-scope-rules/
https://macronepal.com/mastering-c-register-storage-class-for-historical-context-and-modern-alternatives/
https://macronepal.com/mastering-_thread_local-in-c/
https://macronepal.com/c-extern-storage-class-mechanics-and-usage/
https://macronepal.com/understanding-the-c-static-storage-class-mechanics-and-usage/
https://macronepal.com/c-auto-storage-class/
https://macronepal.com/c-typedef-with-pointers/
Extra Articles
https://macronepal.com/13757-2/
https://macronepal.com/13748-2/
https://macronepal.com/13747-2/
https://macronepal.com/13746-2/
https://macronepal.com/13745-2/
https://macronepal.com/13708-2/
https://macronepal.com/13707-2/
https://macronepal.com/13702-2/
Online Compilers
https://macronepal.com/free-html-online-code-compiler/
https://macronepal.com/free-online-python-code-compiler/
https://macronepal.com/free-online-python2-code-compiler/
https://macronepal.com/free-online-java-code-compiler/
https://macronepal.com/free-online-javascript-code-compiler/
https://macronepal.com/free-online-node-js-code-compiler/
https://macronepal.com/free-online-c-code-compiler/
https://macronepal.com/free-online-c-code-compiler-2/
https://macronepal.com/free-online-c-code-compiler-3/
https://macronepal.com/free-online-php-code-compiler/
https://macronepal.com/free-online-ruby-code-compiler/
https://macronepal.com/free-online-perl-code-compiler/
https://macronepal.com/free-online-lua-code-compiler/
https://macronepal.com/free-online-tcl-code-compiler/
https://macronepal.com/free-online-groovy-code-compiler/
https://macronepal.com/free-online-j-shell-code-compiler/
https://macronepal.com/free-online-haskell-code-compiler/
https://macronepal.com/free-online-scala-code-compiler/
https://macronepal.com/free-online-common-lisp-code-compiler/
https://macronepal.com/free-online-d-code-compiler/
https://macronepal.com/free-online-ada-code-compiler/
https://macronepal.com/free-erlang-code-compiler/
https://macronepal.com/free-online-assembly-code-compiler/
Complete Guide to Core & Advanced C Programming Concepts (Functions, Strings, Arrays, Loops, I/O, Control Flow)
https://macronepal.com/bash/building-blocks-of-c-a-complete-guide-to-functions/
Explains how functions in C work as reusable blocks of code, including declaration, definition, parameters, return values, and modular programming structure.
https://macronepal.com/bash/the-heart-of-text-processing-a-complete-guide-to-strings-in-c-2/
Explains how strings are handled in C using character arrays, string manipulation techniques, and common library functions for text processing.
https://macronepal.com/bash/the-cornerstone-of-data-organization-a-complete-guide-to-arrays-in-c/
Explains arrays in C as structured memory storage for multiple values, including indexing, initialization, and efficient data organization.
https://macronepal.com/bash/guaranteed-execution-a-complete-guide-to-the-do-while-loop-in-c/
Explains the do-while loop in C, where the loop body executes at least once before checking the condition.
https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-the-for-loop-in-c/
Explains the for loop in C, including initialization, condition checking, and increment/decrement for controlled iteration.
https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-while-loops-in-c/
Explains the while loop in C, focusing on condition-based repetition and proper loop control mechanisms.
https://macronepal.com/bash/beyond-if-else-a-complete-guide-to-switch-case-in-c/
Explains switch-case statements in C, enabling multi-branch decision-making based on variable values.
https://macronepal.com/bash/mastering-conditional-logic-a-complete-guide-to-if-else-statements-in-c/
Explains if-else statements in C for decision-making and controlling program flow based on conditions.
https://macronepal.com/bash/mastering-the-fundamentals-a-complete-guide-to-arithmetic-operations-in-c/
Explains arithmetic operations in C such as addition, subtraction, multiplication, division, and operator precedence.
https://macronepal.com/bash/foundation-of-c-programming-a-complete-guide-to-basic-input-output/
Explains basic input and output in C using scanf and printf for interacting with users and displaying results.
Online C Code Compiler
https://macronepal.com/free-online-c-code-compiler-2/
