C strchr Function

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);
ParameterDescription
strString to search in
cCharacter to find (passed as int, treated as char)

Return Value

Return ValueMeaning
PointerPoints to first occurrence of character
NULLCharacter 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

FunctionPurposeFinds
strchr()First occurrenceCharacter
strrchr()Last occurrenceCharacter
strstr()First occurrenceSubstring
strpbrk()First of any charactersSet 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

MistakeWrong CodeCorrect Code
Forgetting headerNo include#include <string.h>
Wrong return typechar c = strchr(str, 'a');char *ptr = strchr(str, 'a');
Modifying string literalstrchr("Hi", 'H')[0] = 'h';Use array: char str[]="Hi";
Not checking NULL*strchr(str,'z')Check if(ptr != NULL)

Quick Reference

TaskCode
Find first 'x'char *p = strchr(str, 'x');
Check if foundif(p != NULL)
Get positionint pos = p - str;
Get rest of stringchar *rest = p;
Get before characterCopy up to p - str characters
Find null terminatorstrchr(str, '\0')
Count occurrencesLoop with p = strchr(p+1, c)

Key Points

  1. Returns pointer, not index position
  2. NULL return means character not found
  3. Case-sensitive - 'A' and 'a' are different
  4. Can find null terminator '\0'
  5. First occurrence only - use strrchr() for last
  6. Modifies original string if you change the returned pointer's value
  7. Efficient - single pass through string
  8. 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/

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper