How to cut part of a string in c?
Categories:
How to Extract Substrings in C: A Comprehensive Guide

Learn various methods to cut or extract parts of a string in C, including using standard library functions and manual implementation, with practical code examples and best practices.
Extracting a substring, or 'cutting' a part of a string, is a common operation in C programming. Unlike some higher-level languages that offer built-in substring functions, C requires a more manual approach, often involving memory allocation and character copying. This article will guide you through different techniques to achieve this, from using standard library functions like strncpy
to implementing your own substring extraction logic.
Understanding String Representation in C
Before diving into substring extraction, it's crucial to understand how strings are handled in C. A C string is essentially an array of characters terminated by a null character (\0). This null terminator signifies the end of the string. When you extract a substring, you are creating a new sequence of characters, which also needs to be null-terminated to be considered a valid C string.
flowchart TD A[Original String] --> B{Start Index} B --> C{End Index / Length} C --> D[Allocate Memory for Substring] D --> E[Copy Characters] E --> F[Add Null Terminator] F --> G[New Substring]
Conceptual flow for extracting a substring in C
Method 1: Using strncpy
for Substring Extraction
The strncpy
function from <string.h>
is a common choice for copying a specified number of characters from a source string to a destination. While it's not a direct 'substring' function, it can be effectively used for this purpose. You need to allocate memory for the new substring and then copy the desired portion.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* substring_strncpy(const char *source, int start_index, int length) {
if (source == NULL || start_index < 0 || length < 0) {
return NULL; // Handle invalid input
}
int source_len = strlen(source);
if (start_index >= source_len) {
return NULL; // Start index out of bounds
}
// Adjust length if it goes beyond the source string
if (start_index + length > source_len) {
length = source_len - start_index;
}
char *destination = (char *)malloc(sizeof(char) * (length + 1));
if (destination == NULL) {
return NULL; // Memory allocation failed
}
strncpy(destination, source + start_index, length);
destination[length] = '\0'; // Null-terminate the new string
return destination;
}
int main() {
const char *myString = "Hello, World!";
char *sub1 = substring_strncpy(myString, 0, 5); // "Hello"
char *sub2 = substring_strncpy(myString, 7, 5); // "World"
char *sub3 = substring_strncpy(myString, 7, 20); // "World!" (length adjusted)
char *sub4 = substring_strncpy(myString, 13, 1); // "" (empty string)
if (sub1) { printf("Substring 1: %s\n", sub1); free(sub1); }
if (sub2) { printf("Substring 2: %s\n", sub2); free(sub2); }
if (sub3) { printf("Substring 3: %s\n", sub3); free(sub3); }
if (sub4) { printf("Substring 4: %s\n", sub4); free(sub4); }
return 0;
}
Example of substring extraction using strncpy
.
free()
the dynamically allocated memory for the substring when you are done with it to prevent memory leaks. The strncpy
function does not automatically null-terminate if length
is greater than or equal to the source string's length, so manual null-termination is crucial.Method 2: Manual Character Copying
For more control or if you prefer not to use strncpy
directly, you can implement the substring extraction by manually iterating through the source string and copying characters one by one. This method gives you fine-grained control over the copying process and ensures proper null-termination.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* substring_manual(const char *source, int start_index, int length) {
if (source == NULL || start_index < 0 || length < 0) {
return NULL;
}
int source_len = strlen(source);
if (start_index >= source_len) {
return NULL;
}
if (start_index + length > source_len) {
length = source_len - start_index;
}
char *destination = (char *)malloc(sizeof(char) * (length + 1));
if (destination == NULL) {
return NULL;
}
for (int i = 0; i < length; i++) {
destination[i] = source[start_index + i];
}
destination[length] = '\0'; // Null-terminate
return destination;
}
int main() {
const char *myString = "Programming in C is fun!";
char *sub1 = substring_manual(myString, 0, 11); // "Programming"
char *sub2 = substring_manual(myString, 15, 2); // "is"
char *sub3 = substring_manual(myString, 18, 4); // "fun!"
if (sub1) { printf("Substring 1: %s\n", sub1); free(sub1); }
if (sub2) { printf("Substring 2: %s\n", sub2); free(sub2); }
if (sub3) { printf("Substring 3: %s\n", sub3); free(sub3); }
return 0;
}
Manual substring extraction by iterating and copying characters.
start_index
and length
do not cause out-of-bounds access to the source string. Failing to do so can lead to undefined behavior or crashes.Choosing the Right Method and Best Practices
Both strncpy
and manual copying are valid approaches. strncpy
is often more concise, but requires careful handling of null-termination. Manual copying provides explicit control. When choosing, consider readability, error handling, and performance requirements. For most general-purpose substring extractions, either method is suitable as long as memory management and bounds checking are correctly implemented.
1. Determine Start Index and Length
Identify the starting position (0-indexed) and the number of characters you want to extract from the original string.
2. Allocate Memory
Dynamically allocate memory for the new substring. The size should be length + 1
to accommodate the characters and the null terminator.
3. Copy Characters
Use strncpy
or a loop to copy the desired characters from the source string to the newly allocated memory.
4. Null-Terminate
Crucially, add the null terminator (\0
) at the end of the new substring to make it a valid C string.
5. Free Memory
After you are finished using the substring, free()
the allocated memory to prevent memory leaks.