Multiple Approaches to Check Substring Existence in C Programming

Nov 05, 2025 · Programming · 19 views · 7.8

Keywords: C programming | string manipulation | substring search | strstr function | algorithm implementation

Abstract: This technical article comprehensively explores various methods for checking substring existence in C programming, with detailed analysis of the strstr function and manual implementation techniques. Through complete code examples and performance comparisons, it provides deep insights into string searching algorithms and practical implementation guidelines for developers.

Fundamental Concepts of Substring Search

In C programming, substring search is a fundamental and frequently used operation. Unlike higher-level languages such as C++, C does not have built-in string classes, requiring developers to utilize standard library functions or implement custom solutions for checking substring presence. Understanding this operation is crucial for text processing, search functionality implementation, and various data manipulation scenarios.

Using the Standard Library strstr Function

The C standard library provides the strstr function as the most straightforward method for substring checking. Defined in the <string.h> header, the function prototype is:

char *strstr(const char *haystack, const char *needle);

Where haystack represents the main string to be searched, and needle represents the substring to find. The function's return behavior follows these rules:

In practical applications, checking whether the return value is NULL determines substring existence:

char *sent = "this is my sample example";
char *word = "sample";
if (strstr(sent, word) != NULL) {
    printf("Substring found\n");
} else {
    printf("Substring not found\n");
}

Internal Implementation Principles of strstr

Although strstr is a standard library function, understanding its underlying implementation enhances effective usage. A typical implementation employs nested loop algorithms:

char *custom_strstr(const char *txt, const char *pat) {
    int n = strlen(txt);
    int m = strlen(pat);
    
    if (m == 0) return (char *)txt;
    
    for (int i = 0; i <= n - m; i++) {
        int j;
        for (j = 0; j < m; j++) {
            if (txt[i + j] != pat[j]) {
                break;
            }
        }
        if (j == m) {
            return (char *)(txt + i);
        }
    }
    return NULL;
}

This implementation has a time complexity of O(m×n), where m is the substring length and n is the main string length. While simple and intuitive, it may not be efficient for processing very long strings.

Manual Implementation of Substring Search

Beyond standard library functions, developers can implement custom substring search functionality. Here's a complete implementation example:

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

int find_substring(const char *txt, const char *pat) {
    int txt_len = strlen(txt);
    int pat_len = strlen(pat);
    
    if (pat_len == 0) return 0;
    if (txt_len < pat_len) return -1;
    
    for (int i = 0; i <= txt_len - pat_len; i++) {
        int match = 1;
        for (int j = 0; j < pat_len; j++) {
            if (txt[i + j] != pat[j]) {
                match = 0;
                break;
            }
        }
        if (match) {
            return i;
        }
    }
    return -1;
}

int main() {
    const char *text = "geeksforgeeks";
    const char *pattern = "eks";
    
    int result = find_substring(text, pattern);
    if (result != -1) {
        printf("Substring found at position %d\n", result);
    } else {
        printf("Substring not found\n");
    }
    return 0;
}

Performance Analysis and Optimization Considerations

When selecting substring search methods, performance factors should be considered:

In practical development, prioritizing the strstr function is recommended unless specific performance or functional requirements exist.

Edge Case Handling

Special attention should be paid to the following edge cases when implementing substring search:

// Empty substring case
if (strstr(sent, "") != NULL) {
    // Empty string is always considered to exist in any string
}

// Substring longer than main string
char *long_pattern = "very long pattern that exceeds main string";
if (strlen(long_pattern) > strlen(sent)) {
    // Directly determine as not existing to avoid unnecessary computation
}

Practical Application Example

Here's a complete application example demonstrating substring search in real-world scenarios:

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

bool contains_substring(const char *text, const char *substring) {
    return strstr(text, substring) != NULL;
}

void search_multiple_patterns(const char *text, const char *patterns[], int count) {
    printf("Searching multiple patterns in text:\n");
    for (int i = 0; i < count; i++) {
        if (contains_substring(text, patterns[i])) {
            printf("  ✓ Pattern found: %s\n", patterns[i]);
        } else {
            printf("  ✗ Pattern not found: %s\n", patterns[i]);
        }
    }
}

int main() {
    const char *document = "C is a general-purpose programming language widely used in system programming and embedded development";
    const char *keywords[] = {
        "C programming",
        "system",
        "embedded",
        "Python",
        ""
    };
    
    search_multiple_patterns(document, keywords, 5);
    return 0;
}

Comparison with Other Programming Languages

Different programming languages provide their own substring search methods:

C's strstr function is conceptually similar to counterparts in other languages but returns a pointer rather than an index.

Best Practice Recommendations

Based on practical development experience, the following recommendations are provided:

  1. Always check if strstr return value is NULL
  2. Validate string validity when processing user input
  3. Consider more efficient algorithms for large-scale text searching
  4. Pay attention to memory safety and buffer overflow issues
  5. Consider preprocessing or indexing techniques in performance-critical applications

By appropriately selecting and using substring search methods, program efficiency and reliability can be significantly improved.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.