What is strchr()?
The strchr() function finds the first occurrence of a specific character in a string and returns a pointer to that position. If the character is not found, it returns NULL.
Header File
#include <string.h>
Syntax
char *strchr(const char *str, int c);
| Parameter | Description |
|---|---|
str | String to search in |
c | Character to find (passed as int, treated as char) |
Return Value
| Return Value | Meaning |
|---|---|
| Pointer | Points to first occurrence of character |
| NULL | Character not found in string |
Basic Examples
Example 1: Find First Occurrence
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World";
char *ptr = strchr(str, 'o');
if(ptr != NULL) {
printf("Found 'o' at position: %ld\n", ptr - str); // 4
printf("From 'o' onward: %s\n", ptr); // o World
}
return 0;
}
Example 2: Character Not Found
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
char *ptr = strchr(str, 'z');
if(ptr == NULL) {
printf("Character 'z' not found in '%s'\n", str);
}
return 0;
}
Example 3: Finding Space Character
#include <stdio.h>
#include <string.h>
int main() {
char sentence[] = "Cloud Computing is powerful";
char *space = strchr(sentence, ' ');
if(space != NULL) {
printf("First space at position: %ld\n", space - sentence); // 5
printf("First word: ");
for(int i = 0; i < space - sentence; i++) {
printf("%c", sentence[i]); // Cloud
}
printf("\n");
}
return 0;
}
Practical Examples
Example 4: Count Character Occurrences
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "programming";
char search = 'm';
int count = 0;
char *ptr = str;
while((ptr = strchr(ptr, search)) != NULL) {
count++;
ptr++; // Move to next character
}
printf("Character '%c' appears %d times in '%s'\n",
search, count, str); // 2 times
return 0;
}
Example 5: Extract File Extension
#include <stdio.h>
#include <string.h>
int main() {
char filename[] = "document.pdf";
char *dot = strchr(filename, '.');
if(dot != NULL) {
printf("Filename: %s\n", filename);
printf("Extension: %s\n", dot + 1); // pdf
printf("Name without extension: ");
for(int i = 0; i < dot - filename; i++) {
printf("%c", filename[i]); // document
}
printf("\n");
} else {
printf("No extension found\n");
}
return 0;
}
Example 6: Parse URL or Path
#include <stdio.h>
#include <string.h>
int main() {
char url[] = "https://example.com/page.html";
// Find protocol separator
char *colon = strchr(url, ':');
if(colon != NULL) {
printf("Protocol: ");
for(int i = 0; i < colon - url; i++) {
printf("%c", url[i]); // https
}
printf("\n");
// Find domain after ://
char *slash = strchr(colon + 3, '/');
if(slash != NULL) {
printf("Domain: ");
for(int i = colon + 3; i < slash - url; i++) {
printf("%c", url[i]); // example.com
}
printf("\n");
printf("Path: %s\n", slash); // /page.html
}
}
return 0;
}
Example 7: Email Validation (Simple)
#include <stdio.h>
#include <string.h>
int main() {
char email[] = "[email protected]";
char *at = strchr(email, '@');
if(at != NULL) {
printf("Valid email format\n");
printf("Username: ");
for(int i = 0; i < at - email; i++) {
printf("%c", email[i]); // user
}
printf("\n");
printf("Domain: %s\n", at + 1); // example.com
} else {
printf("Invalid email - missing '@'\n");
}
return 0;
}
Example 8: Remove Trailing Newline
#include <stdio.h>
#include <string.h>
int main() {
char input[100];
printf("Enter text: ");
fgets(input, sizeof(input), stdin);
// Find newline and replace with null terminator
char *newline = strchr(input, '\n');
if(newline != NULL) {
*newline = '\0';
}
printf("You entered: '%s'\n", input);
printf("Length: %lu\n", strlen(input));
return 0;
}
Example 9: Split String at Character
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Apple,Banana,Orange,Grape";
char *comma;
printf("Original: %s\n", str);
// Find first comma
comma = strchr(str, ',');
if(comma != NULL) {
*comma = '\0'; // Replace comma with null terminator
printf("First fruit: %s\n", str); // Apple
printf("Remaining: %s\n", comma + 1); // Banana,Orange,Grape
}
return 0;
}
Example 10: Find Multiple Characters
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World!";
char chars[] = "aeiou"; // vowels to find
int found = -1;
// Find first vowel in string
for(int i = 0; chars[i] != '\0'; i++) {
char *ptr = strchr(str, chars[i]);
if(ptr != NULL) {
int pos = ptr - str;
if(found == -1 || pos < found) {
found = pos;
}
}
}
if(found != -1) {
printf("First vowel found at position %d: '%c'\n",
found, str[found]); // 'e' at position 1
}
return 0;
}
strchr() vs Related Functions
| Function | Purpose | Finds |
|---|---|---|
strchr() | First occurrence | Character |
strrchr() | Last occurrence | Character |
strstr() | First occurrence | Substring |
strpbrk() | First of any characters | Set of characters |
Example: strchr vs strrchr
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Cloud Computing Cloud";
char *first = strchr(str, 'C');
char *last = strrchr(str, 'C');
printf("String: %s\n", str);
printf("First 'C': position %ld - %s\n", first - str, first);
printf("Last 'C': position %ld - %s\n", last - str, last);
return 0;
}
/* Output:
First 'C': position 0 - Cloud Computing Cloud
Last 'C': position 16 - Cloud
*/
Example: strchr vs strpbrk
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World!";
// strchr - finds single character
char *space = strchr(str, ' ');
printf("strchr space: %s\n", space); // " World!"
// strpbrk - finds any character from set
char *found = strpbrk(str, "aeiou");
printf("strpbrk vowel: %s\n", found); // "ello World!"
return 0;
}
Manual Implementation
#include <stdio.h>
char *my_strchr(const char *str, int c) {
while(*str != '\0') {
if(*str == (char)c) {
return (char*)str; // Found
}
str++;
}
// Check if searching for null terminator
if(c == '\0') {
return (char*)str;
}
return NULL; // Not found
}
int main() {
char str[] = "Programming";
char *ptr1 = my_strchr(str, 'g');
char *ptr2 = my_strchr(str, 'z');
if(ptr1) printf("Found 'g': %s\n", ptr1); // "gramming"
if(!ptr2) printf("'z' not found\n");
return 0;
}
Finding Null Terminator (Special Case)
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
// strchr can find null terminator
char *end = strchr(str, '\0');
if(end != NULL) {
printf("Null terminator at position: %ld\n", end - str); // 5
printf("String length: %ld\n", strlen(str)); // 5
}
return 0;
}
Common Use Cases
1. Check if Character Exists
if(strchr("yesno", 'y') != NULL) {
printf("Character found\n");
}
2. Get Substring After Character
char *ptr = strchr(text, '@');
if(ptr) {
char *domain = ptr + 1; // After @
}
3. Remove All Occurrences
#include <stdio.h>
#include <string.h>
void remove_char(char *str, char remove) {
char *read = str;
char *write = str;
while(*read) {
if(*read != remove) {
*write = *read;
write++;
}
read++;
}
*write = '\0';
}
int main() {
char text[] = "Hello World";
remove_char(text, 'o');
printf("%s\n", text); // Hell Wrld
return 0;
}
4. Validate Character Set
#include <stdio.h>
#include <string.h>
int main() {
char password[] = "Pass123!";
char special[] = "!@#$%";
int has_special = 0;
for(int i = 0; special[i]; i++) {
if(strchr(password, special[i])) {
has_special = 1;
break;
}
}
if(has_special) {
printf("Password contains special character\n");
} else {
printf("Password needs a special character\n");
}
return 0;
}
Common Mistakes
| Mistake | Wrong Code | Correct Code |
|---|---|---|
| Forgetting header | No include | #include <string.h> |
| Wrong return type | char c = strchr(str, 'a'); | char *ptr = strchr(str, 'a'); |
| Modifying string literal | strchr("Hi", 'H')[0] = 'h'; | Use array: char str[]="Hi"; |
| Not checking NULL | *strchr(str,'z') | Check if(ptr != NULL) |
Quick Reference
| Task | Code |
|---|---|
| Find first 'x' | char *p = strchr(str, 'x'); |
| Check if found | if(p != NULL) |
| Get position | int pos = p - str; |
| Get rest of string | char *rest = p; |
| Get before character | Copy up to p - str characters |
| Find null terminator | strchr(str, '\0') |
| Count occurrences | Loop with p = strchr(p+1, c) |
Key Points
- Returns pointer, not index position
- NULL return means character not found
- Case-sensitive - 'A' and 'a' are different
- Can find null terminator
'\0' - First occurrence only - use
strrchr()for last - Modifies original string if you change the returned pointer's value
- Efficient - single pass through string
- Use if(ptr) to check non-NULL (equivalent to
if(ptr != NULL))
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/