c
examples
examples.cš§c
/**
* String Manipulation - Examples
*
* This file demonstrates string manipulation techniques in C.
*
* Compile: gcc examples.c -o examples
* Run: ./examples
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* ============================================================
* EXAMPLE 1: Case Conversion Functions
* ============================================================ */
// Convert string to uppercase
void to_uppercase(char *str) {
while (*str) {
*str = toupper(*str);
str++;
}
}
// Convert string to lowercase
void to_lowercase(char *str) {
while (*str) {
*str = tolower(*str);
str++;
}
}
// Convert to title case (capitalize first letter of each word)
void to_titlecase(char *str) {
int capitalize = 1; // Start with first letter
while (*str) {
if (isspace(*str)) {
capitalize = 1;
} else if (capitalize) {
*str = toupper(*str);
capitalize = 0;
} else {
*str = tolower(*str);
}
str++;
}
}
// Toggle case of each character
void toggle_case(char *str) {
while (*str) {
if (isupper(*str)) {
*str = tolower(*str);
} else if (islower(*str)) {
*str = toupper(*str);
}
str++;
}
}
void example1_case_conversion(void) {
printf("=== EXAMPLE 1: Case Conversion ===\n\n");
char text1[] = "Hello World";
char text2[] = "Hello World";
char text3[] = "hello world";
char text4[] = "Hello World";
printf("Original: \"%s\"\n\n", text1);
// Uppercase
to_uppercase(text1);
printf("to_uppercase: \"%s\"\n", text1);
// Lowercase
to_lowercase(text2);
printf("to_lowercase: \"%s\"\n", text2);
// Title case
to_titlecase(text3);
printf("to_titlecase: \"%s\"\n", text3);
// Toggle case
toggle_case(text4);
printf("toggle_case: \"%s\"\n", text4);
printf("\n--- ctype.h Character Functions ---\n");
printf("toupper('a') = '%c'\n", toupper('a'));
printf("tolower('Z') = '%c'\n", tolower('Z'));
printf("isupper('A') = %d (true)\n", isupper('A') != 0);
printf("islower('a') = %d (true)\n", islower('a') != 0);
printf("isalpha('X') = %d (true)\n", isalpha('X') != 0);
printf("isdigit('5') = %d (true)\n", isdigit('5') != 0);
}
/* ============================================================
* EXAMPLE 2: Reversing Strings
* ============================================================ */
// In-place string reversal using indices
void reverse_string(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = temp;
}
}
// Pointer-based string reversal
void reverse_string_ptr(char *str) {
char *start = str;
char *end = str + strlen(str) - 1;
while (start < end) {
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
// Reverse words in a string
void reverse_words(char *str) {
// First, reverse the entire string
reverse_string(str);
// Then reverse each word
char *word_start = str;
char *ptr = str;
while (*ptr) {
if (*ptr == ' ') {
// Reverse the word before this space
*ptr = '\0';
reverse_string(word_start);
*ptr = ' ';
word_start = ptr + 1;
}
ptr++;
}
// Reverse the last word
reverse_string(word_start);
}
void example2_reversing(void) {
printf("\n=== EXAMPLE 2: Reversing Strings ===\n\n");
char text1[] = "Hello";
char text2[] = "World";
char text3[] = "Hello World";
printf("--- In-place Reversal (index-based) ---\n");
printf("Before: \"%s\"\n", text1);
reverse_string(text1);
printf("After: \"%s\"\n\n", text1);
printf("--- Pointer-based Reversal ---\n");
printf("Before: \"%s\"\n", text2);
reverse_string_ptr(text2);
printf("After: \"%s\"\n\n", text2);
printf("--- Reverse Words ---\n");
printf("Before: \"%s\"\n", text3);
reverse_words(text3);
printf("After: \"%s\"\n", text3);
}
/* ============================================================
* EXAMPLE 3: Trimming Whitespace
* ============================================================ */
// Trim leading whitespace (returns pointer to first non-space)
char* ltrim(char *str) {
while (isspace(*str)) {
str++;
}
return str;
}
// Trim trailing whitespace (modifies string in place)
void rtrim(char *str) {
int len = strlen(str);
while (len > 0 && isspace(str[len - 1])) {
len--;
}
str[len] = '\0';
}
// Trim both ends in place
void trim(char *str) {
// Trim leading
char *start = str;
while (isspace(*start)) {
start++;
}
// All whitespace?
if (*start == '\0') {
*str = '\0';
return;
}
// Trim trailing
char *end = start + strlen(start) - 1;
while (end > start && isspace(*end)) {
end--;
}
// Move trimmed string and terminate
size_t len = end - start + 1;
memmove(str, start, len);
str[len] = '\0';
}
void example3_trimming(void) {
printf("\n=== EXAMPLE 3: Trimming Whitespace ===\n\n");
char text1[] = " Hello World";
char text2[] = "Hello World ";
char text3[] = " Hello World ";
printf("--- Left Trim (ltrim) ---\n");
printf("Before: \"%s\" (length %zu)\n", text1, strlen(text1));
char *trimmed = ltrim(text1);
printf("After: \"%s\" (length %zu)\n\n", trimmed, strlen(trimmed));
printf("--- Right Trim (rtrim) ---\n");
printf("Before: \"%s\" (length %zu)\n", text2, strlen(text2));
rtrim(text2);
printf("After: \"%s\" (length %zu)\n\n", text2, strlen(text2));
printf("--- Trim Both (trim) ---\n");
printf("Before: \"%s\" (length %zu)\n", text3, strlen(text3));
trim(text3);
printf("After: \"%s\" (length %zu)\n", text3, strlen(text3));
}
/* ============================================================
* EXAMPLE 4: Padding Strings
* ============================================================ */
// Left pad string to total length
void lpad(char *str, size_t total_len, char pad_char) {
size_t current_len = strlen(str);
if (current_len >= total_len) return;
size_t pad_count = total_len - current_len;
// Move string right
memmove(str + pad_count, str, current_len + 1);
// Fill with pad character
memset(str, pad_char, pad_count);
}
// Right pad string to total length
void rpad(char *str, size_t total_len, char pad_char) {
size_t current_len = strlen(str);
if (current_len >= total_len) return;
memset(str + current_len, pad_char, total_len - current_len);
str[total_len] = '\0';
}
// Center string with padding
void center(char *str, size_t total_len, char pad_char) {
size_t current_len = strlen(str);
if (current_len >= total_len) return;
size_t pad_total = total_len - current_len;
size_t left_pad = pad_total / 2;
size_t right_pad = pad_total - left_pad;
// Move string right
memmove(str + left_pad, str, current_len);
// Pad left
memset(str, pad_char, left_pad);
// Pad right and terminate
memset(str + left_pad + current_len, pad_char, right_pad);
str[total_len] = '\0';
}
void example4_padding(void) {
printf("\n=== EXAMPLE 4: Padding Strings ===\n\n");
char num1[15] = "42";
char text2[20] = "Hello";
char text3[20] = "Hi";
printf("--- Left Pad (lpad) ---\n");
printf("Before: \"%s\"\n", num1);
lpad(num1, 8, '0');
printf("lpad(str, 8, '0'): \"%s\"\n\n", num1);
printf("--- Right Pad (rpad) ---\n");
printf("Before: \"%s\"\n", text2);
rpad(text2, 10, '.');
printf("rpad(str, 10, '.'): \"%s\"\n\n", text2);
printf("--- Center ---\n");
printf("Before: \"%s\"\n", text3);
center(text3, 10, '-');
printf("center(str, 10, '-'): \"%s\"\n", text3);
}
/* ============================================================
* EXAMPLE 5: Character Replacement
* ============================================================ */
// Replace all occurrences of a character
void replace_char(char *str, char old_char, char new_char) {
while (*str) {
if (*str == old_char) {
*str = new_char;
}
str++;
}
}
// Count occurrences of a character
int count_char(const char *str, char c) {
int count = 0;
while (*str) {
if (*str == c) count++;
str++;
}
return count;
}
// Remove all occurrences of a character
void remove_char(char *str, char c) {
char *read = str;
char *write = str;
while (*read) {
if (*read != c) {
*write++ = *read;
}
read++;
}
*write = '\0';
}
void example5_char_replacement(void) {
printf("\n=== EXAMPLE 5: Character Replacement ===\n\n");
char text1[] = "Hello World";
char text2[] = "Mississippi";
char text3[] = "Hello World!";
printf("--- Replace Character ---\n");
printf("Before: \"%s\"\n", text1);
replace_char(text1, ' ', '_');
printf("replace_char(str, ' ', '_'): \"%s\"\n\n", text1);
printf("--- Count Character ---\n");
printf("String: \"%s\"\n", text2);
printf("Count of 's': %d\n", count_char(text2, 's'));
printf("Count of 'i': %d\n\n", count_char(text2, 'i'));
printf("--- Remove Character ---\n");
printf("Before: \"%s\"\n", text3);
remove_char(text3, 'l');
printf("remove_char(str, 'l'): \"%s\"\n", text3);
}
/* ============================================================
* EXAMPLE 6: Substring Replacement
* ============================================================ */
// Replace first occurrence of substring
int replace_first(char *str, size_t size,
const char *old_sub, const char *new_sub) {
char *pos = strstr(str, old_sub);
if (pos == NULL) return 0;
size_t old_len = strlen(old_sub);
size_t new_len = strlen(new_sub);
size_t tail_len = strlen(pos + old_len);
// Check if fits
if (strlen(str) - old_len + new_len >= size) {
return 0;
}
// Move tail
memmove(pos + new_len, pos + old_len, tail_len + 1);
// Copy new substring
memcpy(pos, new_sub, new_len);
return 1;
}
// Replace all occurrences of substring
int replace_all(char *str, size_t size,
const char *old_sub, const char *new_sub) {
int count = 0;
char *pos = str;
while ((pos = strstr(pos, old_sub)) != NULL) {
if (!replace_first(pos, size - (pos - str), old_sub, new_sub)) {
break; // No room
}
pos += strlen(new_sub);
count++;
}
return count;
}
// Count substring occurrences
int count_substring(const char *str, const char *sub) {
int count = 0;
const char *ptr = str;
while ((ptr = strstr(ptr, sub)) != NULL) {
count++;
ptr++;
}
return count;
}
void example6_substring_replacement(void) {
printf("\n=== EXAMPLE 6: Substring Replacement ===\n\n");
char text1[100] = "Hello World";
char text2[100] = "the cat sat on the mat";
char text3[] = "one two one three one";
printf("--- Replace First Substring ---\n");
printf("Before: \"%s\"\n", text1);
replace_first(text1, sizeof(text1), "World", "C");
printf("replace_first(str, \"World\", \"C\"): \"%s\"\n\n", text1);
printf("--- Replace All Substrings ---\n");
printf("Before: \"%s\"\n", text2);
int count = replace_all(text2, sizeof(text2), "the", "a");
printf("replace_all(str, \"the\", \"a\"): \"%s\"\n", text2);
printf("Replacements made: %d\n\n", count);
printf("--- Count Substring ---\n");
printf("String: \"%s\"\n", text3);
printf("Count of \"one\": %d\n", count_substring(text3, "one"));
}
/* ============================================================
* EXAMPLE 7: Splitting and Joining
* ============================================================ */
// Split string into array of tokens
int split(char *str, const char *delim, char **tokens, int max_tokens) {
int count = 0;
char *token = strtok(str, delim);
while (token != NULL && count < max_tokens) {
tokens[count++] = token;
token = strtok(NULL, delim);
}
return count;
}
// Join array of strings with delimiter
void join(char *result, size_t size,
char **strings, int count, const char *delim) {
if (count == 0) {
result[0] = '\0';
return;
}
result[0] = '\0';
for (int i = 0; i < count; i++) {
if (i > 0) {
strncat(result, delim, size - strlen(result) - 1);
}
strncat(result, strings[i], size - strlen(result) - 1);
}
}
void example7_split_join(void) {
printf("\n=== EXAMPLE 7: Splitting and Joining ===\n\n");
char text[] = "apple,banana,cherry,date";
char *tokens[10];
printf("--- Split String ---\n");
printf("Original: \"%s\"\n", text);
int count = split(text, ",", tokens, 10);
printf("Split by ',': %d tokens\n", count);
for (int i = 0; i < count; i++) {
printf(" tokens[%d] = \"%s\"\n", i, tokens[i]);
}
printf("\n--- Join Strings ---\n");
char *words[] = {"Hello", "World", "!"};
char result[50];
join(result, sizeof(result), words, 3, " ");
printf("Join [\"Hello\", \"World\", \"!\"] with ' ':\n");
printf(" Result: \"%s\"\n", result);
join(result, sizeof(result), words, 3, "->");
printf("Join with \"->\":\n");
printf(" Result: \"%s\"\n", result);
}
/* ============================================================
* EXAMPLE 8: Extracting Substrings
* ============================================================ */
// Extract substring from start position with given length
void substring(char *dest, const char *src, int start, int length) {
int src_len = strlen(src);
if (start >= src_len) {
dest[0] = '\0';
return;
}
if (start + length > src_len) {
length = src_len - start;
}
strncpy(dest, src + start, length);
dest[length] = '\0';
}
// Extract until a specific character
void extract_until(char *dest, const char *src, char stop_char) {
while (*src && *src != stop_char) {
*dest++ = *src++;
}
*dest = '\0';
}
// Extract text between two delimiter characters
int extract_between(char *dest, const char *src,
char start_char, char end_char) {
const char *start = strchr(src, start_char);
if (start == NULL) return 0;
start++; // Move past start character
const char *end = strchr(start, end_char);
if (end == NULL) return 0;
size_t len = end - start;
strncpy(dest, start, len);
dest[len] = '\0';
return 1;
}
void example8_extraction(void) {
printf("\n=== EXAMPLE 8: Extracting Substrings ===\n\n");
char result[50];
printf("--- Substring ---\n");
const char *text = "Hello World";
printf("Source: \"%s\"\n", text);
substring(result, text, 0, 5);
printf("substring(str, 0, 5): \"%s\"\n", result);
substring(result, text, 6, 5);
printf("substring(str, 6, 5): \"%s\"\n\n", result);
printf("--- Extract Until ---\n");
const char *email = "user@example.com";
printf("Email: \"%s\"\n", email);
extract_until(result, email, '@');
printf("extract_until(str, '@'): \"%s\"\n\n", result);
printf("--- Extract Between ---\n");
const char *tagged = "Hello (World) Test";
printf("Source: \"%s\"\n", tagged);
extract_between(result, tagged, '(', ')');
printf("extract_between(str, '(', ')'): \"%s\"\n", result);
}
/* ============================================================
* EXAMPLE 9: String Validation
* ============================================================ */
// Check if string is numeric
int is_numeric(const char *str) {
if (*str == '\0') return 0;
// Allow leading sign
if (*str == '+' || *str == '-') str++;
if (*str == '\0') return 0;
while (*str) {
if (!isdigit(*str)) return 0;
str++;
}
return 1;
}
// Check if string is alphabetic
int is_alphabetic(const char *str) {
if (*str == '\0') return 0;
while (*str) {
if (!isalpha(*str)) return 0;
str++;
}
return 1;
}
// Check if string is alphanumeric
int is_alphanumeric(const char *str) {
if (*str == '\0') return 0;
while (*str) {
if (!isalnum(*str)) return 0;
str++;
}
return 1;
}
// Simple email validation
int is_valid_email_simple(const char *email) {
const char *at = strchr(email, '@');
if (at == NULL || at == email) return 0;
const char *dot = strrchr(at, '.');
if (dot == NULL || dot == at + 1 || dot[1] == '\0') return 0;
return 1;
}
// Check if palindrome (case insensitive)
int is_palindrome(const char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (tolower(str[i]) != tolower(str[len - 1 - i])) {
return 0;
}
}
return 1;
}
void example9_validation(void) {
printf("\n=== EXAMPLE 9: String Validation ===\n\n");
printf("--- Numeric Validation ---\n");
printf("is_numeric(\"123\"): %s\n", is_numeric("123") ? "true" : "false");
printf("is_numeric(\"-42\"): %s\n", is_numeric("-42") ? "true" : "false");
printf("is_numeric(\"12.5\"): %s\n", is_numeric("12.5") ? "true" : "false");
printf("is_numeric(\"abc\"): %s\n\n", is_numeric("abc") ? "true" : "false");
printf("--- Alphabetic Validation ---\n");
printf("is_alphabetic(\"Hello\"): %s\n", is_alphabetic("Hello") ? "true" : "false");
printf("is_alphabetic(\"Hi2\"): %s\n\n", is_alphabetic("Hi2") ? "true" : "false");
printf("--- Alphanumeric Validation ---\n");
printf("is_alphanumeric(\"Test123\"): %s\n", is_alphanumeric("Test123") ? "true" : "false");
printf("is_alphanumeric(\"Test 123\"): %s\n\n", is_alphanumeric("Test 123") ? "true" : "false");
printf("--- Email Validation (simple) ---\n");
printf("is_valid_email(\"user@example.com\"): %s\n",
is_valid_email_simple("user@example.com") ? "valid" : "invalid");
printf("is_valid_email(\"invalid-email\"): %s\n\n",
is_valid_email_simple("invalid-email") ? "valid" : "invalid");
printf("--- Palindrome Check ---\n");
printf("is_palindrome(\"radar\"): %s\n", is_palindrome("radar") ? "true" : "false");
printf("is_palindrome(\"Level\"): %s\n", is_palindrome("Level") ? "true" : "false");
printf("is_palindrome(\"hello\"): %s\n", is_palindrome("hello") ? "true" : "false");
}
/* ============================================================
* EXAMPLE 10: Common String Algorithms
* ============================================================ */
// Remove duplicate characters (keep first occurrence)
void remove_duplicates(char *str) {
int seen[256] = {0}; // Track seen characters
char *write = str;
while (*str) {
unsigned char c = *str;
if (!seen[c]) {
seen[c] = 1;
*write++ = c;
}
str++;
}
*write = '\0';
}
// Squeeze multiple spaces into one
void squeeze_spaces(char *str) {
char *read = str;
char *write = str;
int prev_space = 0;
while (*read) {
if (isspace(*read)) {
if (!prev_space) {
*write++ = ' ';
prev_space = 1;
}
} else {
*write++ = *read;
prev_space = 0;
}
read++;
}
*write = '\0';
}
// Find the longest word in a string
void longest_word(const char *str, char *result) {
const char *word_start = NULL;
size_t max_len = 0;
const char *max_start = NULL;
while (1) {
if (!isspace(*str) && *str != '\0') {
if (word_start == NULL) {
word_start = str;
}
} else {
if (word_start != NULL) {
size_t len = str - word_start;
if (len > max_len) {
max_len = len;
max_start = word_start;
}
word_start = NULL;
}
}
if (*str == '\0') break;
str++;
}
if (max_start != NULL) {
strncpy(result, max_start, max_len);
result[max_len] = '\0';
} else {
result[0] = '\0';
}
}
// Count words in a string
int count_words(const char *str) {
int count = 0;
int in_word = 0;
while (*str) {
if (isspace(*str)) {
in_word = 0;
} else if (!in_word) {
in_word = 1;
count++;
}
str++;
}
return count;
}
void example10_algorithms(void) {
printf("\n=== EXAMPLE 10: Common String Algorithms ===\n\n");
char text1[] = "programming";
char text2[] = "Hello World !";
char result[50];
printf("--- Remove Duplicates ---\n");
printf("Before: \"%s\"\n", text1);
remove_duplicates(text1);
printf("After: \"%s\"\n\n", text1);
printf("--- Squeeze Spaces ---\n");
printf("Before: \"%s\"\n", text2);
squeeze_spaces(text2);
printf("After: \"%s\"\n\n", text2);
printf("--- Longest Word ---\n");
const char *sentence = "The quick brown fox jumps";
printf("Sentence: \"%s\"\n", sentence);
longest_word(sentence, result);
printf("Longest word: \"%s\"\n\n", result);
printf("--- Count Words ---\n");
printf("Sentence: \"%s\"\n", sentence);
printf("Word count: %d\n", count_words(sentence));
}
/* ============================================================
* EXAMPLE 11: Performance Tips
* ============================================================ */
void example11_performance(void) {
printf("\n=== EXAMPLE 11: Performance Considerations ===\n\n");
char str[] = "Hello World";
printf("--- Avoid Repeated strlen() Calls ---\n\n");
printf("BAD (strlen called every iteration):\n");
printf(" for (int i = 0; i < strlen(str); i++)\n\n");
printf("GOOD (strlen called once):\n");
printf(" size_t len = strlen(str);\n");
printf(" for (int i = 0; i < len; i++)\n\n");
printf("BETTER (check null directly):\n");
printf(" for (int i = 0; str[i] != '\\0'; i++)\n\n");
printf("--- Pointer vs Index Access ---\n\n");
printf("Index-based (offset calculation each time):\n");
printf(" while (str[i] != '\\0') { ... i++; }\n\n");
printf("Pointer-based (direct access, faster):\n");
printf(" char *ptr = str;\n");
printf(" while (*ptr) { ... ptr++; }\n");
// Demo
printf("\n--- Demonstration ---\n");
printf("String: \"%s\"\n\n", str);
printf("Index-based iteration:\n ");
for (int i = 0; str[i] != '\0'; i++) {
printf("%c ", str[i]);
}
printf("\n\n");
printf("Pointer-based iteration:\n ");
char *ptr = str;
while (*ptr) {
printf("%c ", *ptr++);
}
printf("\n");
}
/* ============================================================
* EXAMPLE 12: Complete String Utility Demo
* ============================================================ */
// Comprehensive string statistics
typedef struct {
int length;
int words;
int vowels;
int consonants;
int digits;
int spaces;
int uppercase;
int lowercase;
} StringStats;
StringStats analyze_string(const char *str) {
StringStats stats = {0};
const char *vowels = "aeiouAEIOU";
int in_word = 0;
while (*str) {
stats.length++;
if (isspace(*str)) {
stats.spaces++;
in_word = 0;
} else {
if (!in_word) {
stats.words++;
in_word = 1;
}
if (isdigit(*str)) {
stats.digits++;
} else if (isalpha(*str)) {
if (strchr(vowels, *str)) {
stats.vowels++;
} else {
stats.consonants++;
}
if (isupper(*str)) {
stats.uppercase++;
} else {
stats.lowercase++;
}
}
}
str++;
}
return stats;
}
void example12_comprehensive(void) {
printf("\n=== EXAMPLE 12: Comprehensive String Analysis ===\n\n");
const char *text = "Hello World! C Programming 101.";
printf("Analyzing: \"%s\"\n\n", text);
StringStats stats = analyze_string(text);
printf("Statistics:\n");
printf(" Length: %d characters\n", stats.length);
printf(" Words: %d\n", stats.words);
printf(" Vowels: %d\n", stats.vowels);
printf(" Consonants: %d\n", stats.consonants);
printf(" Digits: %d\n", stats.digits);
printf(" Spaces: %d\n", stats.spaces);
printf(" Uppercase: %d\n", stats.uppercase);
printf(" Lowercase: %d\n", stats.lowercase);
}
/* ============================================================
* MAIN FUNCTION
* ============================================================ */
int main(void) {
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā STRING MANIPULATION IN C - EXAMPLES ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n");
example1_case_conversion();
example2_reversing();
example3_trimming();
example4_padding();
example5_char_replacement();
example6_substring_replacement();
example7_split_join();
example8_extraction();
example9_validation();
example10_algorithms();
example11_performance();
example12_comprehensive();
printf("\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
printf("ā ALL EXAMPLES COMPLETED! ā\n");
printf("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n");
return 0;
}