The strstr() function finds the first occurrence of a substring within a larger string. It returns a pointer to the beginning of the found substring, or NULL if the substring is not found.
Basic Syntax
#include <string.h> char *strstr(const char *haystack, const char *needle);
| Parameter | Description |
|---|---|
haystack | The main string to search in |
needle | The substring to search for |
| Return value | Pointer to first occurrence, or NULL if not found |
Example 1: Basic Substring Search
#include <stdio.h>
#include <string.h>
int main() {
char text[] = "The quick brown fox jumps over the lazy dog";
char word[] = "fox";
char *result = strstr(text, word);
if(result != NULL) {
printf("Found '%s' at position: %ld\n", word, result - text);
printf("Remaining string: %s\n", result);
} else {
printf("Substring not found\n");
}
return 0;
}
Output:
Found 'fox' at position: 16 Remaining string: fox jumps over the lazy dog
Example 2: Substring Not Found
#include <stdio.h>
#include <string.h>
int main() {
char sentence[] = "Hello World";
char search[] = "xyz";
char *result = strstr(sentence, search);
if(result == NULL) {
printf("'%s' not found in '%s'\n", search, sentence);
}
return 0;
}
Output:
'xyz' not found in 'Hello World'
Example 3: Finding All Occurrences
#include <stdio.h>
#include <string.h>
int main() {
char text[] = "the cat in the hat sat on the mat";
char search[] = "the";
char *ptr = text;
int count = 0;
while((ptr = strstr(ptr, search)) != NULL) {
printf("Found '%s' at position: %ld\n", search, ptr - text);
ptr++; // Move past this occurrence
count++;
}
printf("Total occurrences: %d\n", count);
return 0;
}
Output:
Found 'the' at position: 0 Found 'the' at position: 11 Found 'the' at position: 23 Total occurrences: 3
Example 4: Extracting Text Before/After Substring
#include <stdio.h>
#include <string.h>
int main() {
char data[] = "username=john123&password=secret";
char delimiter[] = "=";
char *equal_sign = strstr(data, delimiter);
if(equal_sign != NULL) {
// Extract key (before =)
int key_len = equal_sign - data;
char key[50];
strncpy(key, data, key_len);
key[key_len] = '\0';
// Extract value (after =)
char *value = equal_sign + 1;
char val[50];
strcpy(val, value);
printf("Key: %s\n", key);
printf("Value: %s\n", val);
}
return 0;
}
Output:
Key: username Value: john123&password=secret
Example 5: Finding File Extension
#include <stdio.h>
#include <string.h>
int main() {
char filename[] = "document.pdf";
char *dot = strstr(filename, ".");
if(dot != NULL) {
printf("Filename: %.*s\n", (int)(dot - filename), filename);
printf("Extension: %s\n", dot + 1);
}
// Another example with multiple dots
char file2[] = "backup.tar.gz";
char *last_dot = strrchr(file2, '.'); // strrchr finds last occurrence
if(last_dot != NULL) {
printf("\nFile: %s\n", file2);
printf("Extension: %s\n", last_dot + 1);
}
return 0;
}
Output:
Filename: document Extension: pdf File: backup.tar.gz Extension: gz
Example 6: Case-Sensitive vs Case-Insensitive
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Custom case-insensitive version
char *stristr(const char *haystack, const char *needle) {
if(!*needle) return (char*)haystack;
for(; *haystack; haystack++) {
if(tolower(*haystack) == tolower(*needle)) {
const char *h = haystack;
const char *n = needle;
while(*h && *n && tolower(*h) == tolower(*n)) {
h++;
n++;
}
if(!*n) return (char*)haystack;
}
}
return NULL;
}
int main() {
char text[] = "Hello WORLD, world is beautiful";
// strstr is case-sensitive
char *result1 = strstr(text, "world");
printf("strstr('world'): %s\n", result1 ? "Found" : "Not found");
char *result2 = strstr(text, "WORLD");
printf("strstr('WORLD'): %s\n", result2 ? result2 : "Not found");
// Case-insensitive version
char *result3 = stristr(text, "world");
printf("stristr('world'): %s\n", result3);
return 0;
}
Output:
strstr('world'): Found
strstr('WORLD'): WORLD, world is beautiful
stristr('world'): Hello WORLD, world is beautiful
Example 7: Replacing Substring
#include <stdio.h>
#include <string.h>
void replaceFirst(char *text, const char *find, const char *replace) {
char *pos = strstr(text, find);
if(pos != NULL) {
char temp[200];
int prefix_len = pos - text;
int find_len = strlen(find);
// Build new string
strncpy(temp, text, prefix_len);
temp[prefix_len] = '\0';
strcat(temp, replace);
strcat(temp, pos + find_len);
// Copy back
strcpy(text, temp);
}
}
int main() {
char message[200] = "I like apples and apples are tasty";
printf("Original: %s\n", message);
replaceFirst(message, "apples", "oranges");
printf("After replace: %s\n", message);
return 0;
}
Output:
Original: I like apples and apples are tasty After replace: I like oranges and apples are tasty
Example 8: Validating String Format
#include <stdio.h>
#include <string.h>
int isValidEmail(const char *email) {
// Check for @ symbol
char *at = strstr(email, "@");
if(at == NULL) return 0;
// Check for dot after @
char *dot = strstr(at, ".");
if(dot == NULL) return 0;
// Check minimal length
if(at - email < 1) return 0;
if(strlen(dot + 1) < 2) return 0;
return 1;
}
int main() {
char emails[][50] = {
"[email protected]",
"invalid.email",
"test@domain",
"[email protected]"
};
for(int i = 0; i < 4; i++) {
printf("%s: %s\n", emails[i],
isValidEmail(emails[i]) ? "Valid" : "Invalid");
}
return 0;
}
Output:
[email protected]: Valid invalid.email: Invalid test@domain: Invalid [email protected]: Valid
Common Mistakes
#include <stdio.h>
#include <string.h>
int main() {
char text[] = "Hello World";
// â WRONG - Checking wrong way
if(strstr(text, "World") > 0) { // Comparing pointer to int
printf("This comparison is wrong\n");
}
// â
CORRECT - Check against NULL
if(strstr(text, "World") != NULL) {
printf("Found correctly\n");
}
// â WRONG - Empty needle (returns haystack always)
char *result = strstr(text, "");
printf("Empty needle returns: %s\n", result); // Returns whole string
// â WRONG - Modifying string literal with result
char *literal = "Constant string";
char *found = strstr(literal, "stant");
// found[0] = 'X'; // CRASH - String literal is read-only
// â
CORRECT - Use modifiable array
char modifiable[] = "Constant string";
char *found2 = strstr(modifiable, "stant");
if(found2) found2[0] = 'X'; // Works fine
printf("Modified: %s\n", modifiable);
return 0;
}
Output:
Found correctly Empty needle returns: Hello World Modified: ConXtant string
strstr vs Other Search Functions
| Function | Description | Return Value |
|---|---|---|
strstr(haystack, needle) | Find first substring | Pointer or NULL |
strchr(str, char) | Find first character | Pointer or NULL |
strrchr(str, char) | Find last character | Pointer or NULL |
strpbrk(str, chars) | Find any character from set | Pointer or NULL |
strspn(str, chars) | Length of initial segment | Length (size_t) |
strcspn(str, chars) | Length before any match | Length (size_t) |
Performance Considerations
#include <stdio.h>
#include <string.h>
#include <time.h>
// Simple naive search (similar to strstr)
char *naive_search(const char *haystack, const char *needle) {
size_t hlen = strlen(haystack);
size_t nlen = strlen(needle);
if(nlen == 0) return (char*)haystack;
for(size_t i = 0; i <= hlen - nlen; i++) {
if(memcmp(haystack + i, needle, nlen) == 0) {
return (char*)(haystack + i);
}
}
return NULL;
}
int main() {
char text[1000] = "This is a test string for searching patterns";
char pattern[] = "searching";
// strstr is highly optimized (often uses advanced algorithms)
clock_t start = clock();
for(int i = 0; i < 1000000; i++) {
strstr(text, pattern);
}
clock_t end = clock();
printf("strstr time: %f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
Practical Example: Simple HTML Parser
#include <stdio.h>
#include <string.h>
void extractLinks(const char *html) {
const char *ptr = html;
char *link_start, *link_end;
while((link_start = strstr(ptr, "href=\"")) != NULL) {
link_start += 6; // Skip 'href="'
link_end = strstr(link_start, "\"");
if(link_end != NULL) {
int len = link_end - link_start;
printf("Found link: %.*s\n", len, link_start);
ptr = link_end;
} else {
break;
}
}
}
int main() {
char html[] =
"<a href=\"https://example.com\">Example</a> "
"<a href=\"/page.html\">Page</a> "
"<img src=\"image.jpg\">";
extractLinks(html);
return 0;
}
Output:
Found link: https://example.com Found link: /page.html
Quick Reference
| Operation | Code | Result |
|---|---|---|
| Find substring | strstr(text, "word") | Pointer or NULL |
| Get position | pos = strstr(text, "word") - text | Index or -1 if not found |
| Check exists | if(strstr(text, "word")) | True if found |
| Find after position | strstr(ptr + 1, "word") | Search after current |
| Extract before | strncpy(buf, text, pos - text) | Text before match |
| Extract after | strcpy(buf, pos + len) | Text after match |
Best Practices
- Always check if result is NULL before using the pointer
- Don't modify string literals returned by strstr
- Use pointer arithmetic to get position indices
- Remember it's case-sensitive - convert both strings to same case if needed
- Empty needle returns haystack - handle this case if problematic
- For single characters, use strchr (more efficient than strstr)
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/
