ExamplesC Programming

String Basics

Strings / String Basics

Code Walkthrough
Intermediate
16 min

Learning Objective

Study worked examples for String Basics until you can trace the idea without guessing.

Why It Matters

Reading and running code turns the idea into behavior you can debug, modify, and reuse.

StringDemonstratesFundamentalConceptsCompile
Private notes
0/8000

Notes stay private to your browser until account sync is configured.

Examples
examples.cšŸ”§
/**
 * String Basics - Examples
 * 
 * This file demonstrates fundamental string concepts in C.
 * 
 * Compile: gcc examples.c -o examples
 * Run: ./examples
 */

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

/* ============================================================
 * EXAMPLE 1: String Declaration Methods
 * ============================================================ */

void example1_declaration(void) {
    printf("=== EXAMPLE 1: String Declaration Methods ===\n\n");
    
    // Method 1: Character array with size
    char str1[20] = "Hello";
    printf("Method 1 - char str1[20] = \"Hello\";\n");
    printf("  Value: \"%s\"\n", str1);
    printf("  strlen: %zu\n", strlen(str1));
    printf("  sizeof: %zu\n\n", sizeof(str1));
    
    // Method 2: Auto-sized array
    char str2[] = "Hello";
    printf("Method 2 - char str2[] = \"Hello\";\n");
    printf("  Value: \"%s\"\n", str2);
    printf("  strlen: %zu\n", strlen(str2));
    printf("  sizeof: %zu (auto-sized to fit)\n\n", sizeof(str2));
    
    // Method 3: Pointer to literal
    const char *str3 = "Hello";
    printf("Method 3 - const char *str3 = \"Hello\";\n");
    printf("  Value: \"%s\"\n", str3);
    printf("  strlen: %zu\n", strlen(str3));
    printf("  sizeof(str3): %zu (pointer size)\n\n", sizeof(str3));
    
    // Method 4: Character by character
    char str4[6];
    str4[0] = 'H';
    str4[1] = 'e';
    str4[2] = 'l';
    str4[3] = 'l';
    str4[4] = 'o';
    str4[5] = '\0';
    printf("Method 4 - Character by character\n");
    printf("  Value: \"%s\"\n", str4);
    printf("  strlen: %zu\n\n", strlen(str4));
    
    // Method 5: Brace initialization
    char str5[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    printf("Method 5 - char str5[] = {'H','e','l','l','o','\\0'};\n");
    printf("  Value: \"%s\"\n", str5);
    printf("  strlen: %zu\n", strlen(str5));
}


/* ============================================================
 * EXAMPLE 2: The Null Terminator
 * ============================================================ */

void example2_null_terminator(void) {
    printf("\n=== EXAMPLE 2: The Null Terminator ===\n\n");
    
    char str[] = "Hello";
    
    printf("String: \"%s\"\n\n", str);
    printf("Memory contents:\n");
    printf("Index  Char  ASCII\n");
    printf("─────────────────────\n");
    
    for (int i = 0; i <= 5; i++) {
        if (str[i] == '\0') {
            printf("  [%d]  '\\0'   %d (null terminator)\n", i, str[i]);
        } else {
            printf("  [%d]   '%c'   %d\n", i, str[i], str[i]);
        }
    }
    
    printf("\nKey facts about '\\0':\n");
    printf("  '\\0' == 0?    %s\n", ('\0' == 0) ? "true" : "false");
    printf("  '\\0' == '0'?  %s (\\0 is ASCII 0, '0' is ASCII 48)\n", 
           ('\0' == '0') ? "true" : "false");
}


/* ============================================================
 * EXAMPLE 3: strlen vs sizeof
 * ============================================================ */

void example3_strlen_vs_sizeof(void) {
    printf("\n=== EXAMPLE 3: strlen vs sizeof ===\n\n");
    
    char arr1[100] = "Hello";
    char arr2[] = "Hello";
    const char *ptr = "Hello";
    
    printf("Declaration              strlen   sizeof\n");
    printf("───────────────────────────────────────────\n");
    printf("char arr1[100] = \"Hello\"   %-8zu %zu\n", 
           strlen(arr1), sizeof(arr1));
    printf("char arr2[] = \"Hello\"      %-8zu %zu\n", 
           strlen(arr2), sizeof(arr2));
    printf("const char *ptr = \"Hello\"  %-8zu %zu (pointer size)\n", 
           strlen(ptr), sizeof(ptr));
    
    printf("\nKey differences:\n");
    printf("  strlen() - Counts characters until '\\0'\n");
    printf("  sizeof() - Returns total allocated size\n");
}


/* ============================================================
 * EXAMPLE 4: Modifiable vs Read-Only Strings
 * ============================================================ */

void example4_modifiable(void) {
    printf("\n=== EXAMPLE 4: Modifiable vs Read-Only ===\n\n");
    
    // Modifiable (array)
    char arr[] = "Hello";
    printf("char arr[] = \"Hello\" (modifiable):\n");
    printf("  Before: \"%s\"\n", arr);
    arr[0] = 'J';  // Safe - modifying stack memory
    printf("  After arr[0] = 'J': \"%s\"\n\n", arr);
    
    // Read-only (pointer to literal)
    const char *ptr = "Hello";
    printf("const char *ptr = \"Hello\" (read-only):\n");
    printf("  Value: \"%s\"\n", ptr);
    printf("  Modifying ptr[0] = 'J' would cause UNDEFINED BEHAVIOR!\n");
    printf("  The 'const' keyword helps prevent this mistake.\n");
}


/* ============================================================
 * EXAMPLE 5: String Output Methods
 * ============================================================ */

void example5_output(void) {
    printf("\n=== EXAMPLE 5: String Output Methods ===\n\n");
    
    char str[] = "Hello, World!";
    
    printf("Using printf with different format specifiers:\n");
    printf("  %%s:     |%s|\n", str);
    printf("  %%.5s:   |%.5s| (first 5 chars)\n", str);
    printf("  %%20s:   |%20s| (right-aligned)\n", str);
    printf("  %%-20s:  |%-20s| (left-aligned)\n", str);
    printf("  %%20.5s: |%20.5s| (5 chars, right-aligned)\n\n", str);
    
    printf("Using puts():\n  ");
    puts(str);  // Automatically adds newline
    
    printf("\nUsing putchar() (character by character):\n  ");
    for (int i = 0; str[i]; i++) {
        putchar(str[i]);
    }
    putchar('\n');
}


/* ============================================================
 * EXAMPLE 6: Accessing Characters
 * ============================================================ */

void example6_access(void) {
    printf("\n=== EXAMPLE 6: Accessing Characters ===\n\n");
    
    char str[] = "Hello";
    
    printf("String: \"%s\"\n\n", str);
    
    // Array indexing
    printf("Array indexing:\n");
    printf("  str[0] = '%c'\n", str[0]);
    printf("  str[4] = '%c'\n", str[4]);
    printf("  str[5] = '\\0' (value: %d)\n\n", str[5]);
    
    // Pointer arithmetic
    char *ptr = str;
    printf("Pointer arithmetic:\n");
    printf("  *ptr       = '%c'\n", *ptr);
    printf("  *(ptr + 1) = '%c'\n", *(ptr + 1));
    printf("  *(ptr + 4) = '%c'\n", *(ptr + 4));
}


/* ============================================================
 * EXAMPLE 7: Iterating Through Strings
 * ============================================================ */

void example7_iteration(void) {
    printf("\n=== EXAMPLE 7: Iterating Through Strings ===\n\n");
    
    char str[] = "Hello";
    
    // Method 1: Index with length
    printf("Method 1 - Index with strlen:\n  ");
    size_t len = strlen(str);
    for (size_t i = 0; i < len; i++) {
        printf("%c ", str[i]);
    }
    printf("\n\n");
    
    // Method 2: Index until null
    printf("Method 2 - Index until null:\n  ");
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c ", str[i]);
    }
    printf("\n\n");
    
    // Method 3: Pointer-based
    printf("Method 3 - Pointer:\n  ");
    char *ptr = str;
    while (*ptr != '\0') {
        printf("%c ", *ptr);
        ptr++;
    }
    printf("\n\n");
    
    // Method 4: Compact pointer
    printf("Method 4 - Compact pointer:\n  ");
    for (char *p = str; *p; p++) {
        printf("%c ", *p);
    }
    printf("\n");
}


/* ============================================================
 * EXAMPLE 8: String Length Calculation
 * ============================================================ */

// Custom strlen implementations
size_t my_strlen_index(const char *str) {
    size_t len = 0;
    while (str[len] != '\0') {
        len++;
    }
    return len;
}

size_t my_strlen_pointer(const char *str) {
    const char *s = str;
    while (*s) {
        s++;
    }
    return s - str;
}

void example8_length(void) {
    printf("\n=== EXAMPLE 8: String Length ===\n\n");
    
    char str[] = "Hello, World!";
    
    printf("String: \"%s\"\n\n", str);
    printf("strlen(str):        %zu\n", strlen(str));
    printf("my_strlen_index:    %zu\n", my_strlen_index(str));
    printf("my_strlen_pointer:  %zu\n", my_strlen_pointer(str));
    
    printf("\nEmpty string \"\":\n");
    printf("  strlen: %zu\n", strlen(""));
    
    printf("\nString with spaces \"Hi There\":\n");
    printf("  strlen: %zu (spaces count!)\n", strlen("Hi There"));
}


/* ============================================================
 * EXAMPLE 9: Escape Sequences
 * ============================================================ */

void example9_escape(void) {
    printf("\n=== EXAMPLE 9: Escape Sequences ===\n\n");
    
    printf("Common escape sequences:\n\n");
    
    printf("\\n (newline):\n");
    printf("  Line 1\n  Line 2\n\n");
    
    printf("\\t (tab):\n");
    printf("  Col1\tCol2\tCol3\n\n");
    
    printf("\\\\ (backslash):\n");
    printf("  C:\\Users\\Name\n\n");
    
    printf("\\\" (double quote):\n");
    printf("  She said \"Hello\"\n\n");
    
    printf("\\' (single quote):\n");
    printf("  It\\'s working\n\n");
    
    printf("\\0 (null character):\n");
    char test[] = "Hello\0World";
    printf("  \"Hello\\0World\" prints as: \"%s\" (stops at null)\n", test);
}


/* ============================================================
 * EXAMPLE 10: String Concatenation at Compile Time
 * ============================================================ */

void example10_concatenation(void) {
    printf("\n=== EXAMPLE 10: Compile-Time Concatenation ===\n\n");
    
    // Adjacent string literals are concatenated
    const char *msg = "This is a "
                      "very long "
                      "message "
                      "split across "
                      "multiple lines.";
    
    printf("Adjacent string literals:\n");
    printf("  const char *msg = \"This is a \"\n");
    printf("                    \"very long \"\n");
    printf("                    \"message\";\n\n");
    printf("Result: \"%s\"\n", msg);
}


/* ============================================================
 * EXAMPLE 11: Common String Mistakes
 * ============================================================ */

void example11_mistakes(void) {
    printf("\n=== EXAMPLE 11: Common Mistakes ===\n\n");
    
    // Mistake 1: Comparing with ==
    char str1[] = "Hello";
    char str2[] = "Hello";
    
    printf("Mistake 1: Comparing strings with ==\n");
    printf("  char str1[] = \"Hello\";\n");
    printf("  char str2[] = \"Hello\";\n");
    printf("  str1 == str2?  %s (compares addresses!)\n", 
           str1 == str2 ? "true" : "false");
    printf("  strcmp(str1, str2) == 0?  %s (correct way)\n\n",
           strcmp(str1, str2) == 0 ? "true" : "false");
    
    // Mistake 2: Forgetting null terminator
    printf("Mistake 2: Forgetting null terminator\n");
    printf("  char arr[] = {'H','i'}; // NOT a string!\n");
    printf("  char str[] = {'H','i','\\0'}; // IS a string\n\n");
    
    // Mistake 3: Buffer too small
    printf("Mistake 3: Buffer too small\n");
    printf("  char str[5] = \"Hello\"; // No room for \\0!\n");
    printf("  char str[6] = \"Hello\"; // Correct\n\n");
    
    // Mistake 4: Direct assignment
    printf("Mistake 4: Cannot assign strings with =\n");
    printf("  char str[20];\n");
    printf("  str = \"Hello\";  // ERROR! Use strcpy instead\n");
}


/* ============================================================
 * EXAMPLE 12: Empty vs Null String
 * ============================================================ */

void example12_empty_null(void) {
    printf("\n=== EXAMPLE 12: Empty vs Null String ===\n\n");
    
    // Empty string
    char empty[] = "";
    printf("Empty string: char empty[] = \"\";\n");
    printf("  strlen(empty): %zu\n", strlen(empty));
    printf("  empty[0]: %d (it's just \\0)\n\n", empty[0]);
    
    // NULL pointer
    char *null_ptr = NULL;
    printf("NULL pointer: char *null_ptr = NULL;\n");
    printf("  null_ptr: %p\n", (void *)null_ptr);
    printf("  WARNING: strlen(null_ptr) would crash!\n\n");
    
    // Checking for both
    printf("Safe string check pattern:\n");
    printf("  if (str != NULL && str[0] != '\\0') {\n");
    printf("      // String is not null and not empty\n");
    printf("  }\n");
}


/* ============================================================
 * EXAMPLE 13: Memory Layout Visualization
 * ============================================================ */

void example13_memory(void) {
    printf("\n=== EXAMPLE 13: Memory Layout ===\n\n");
    
    char str[] = "Hi";
    
    printf("char str[] = \"Hi\";\n\n");
    printf("Memory layout:\n");
    printf("ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”\n");
    printf("│  'H'  │  'i'  │ '\\0'  │\n");
    printf("│  72   │  105  │   0   │ (ASCII values)\n");
    printf("ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜\n");
    printf("  [0]     [1]     [2]\n\n");
    
    printf("Actual addresses:\n");
    for (int i = 0; i <= 2; i++) {
        printf("  str[%d] at %p = ", i, (void *)&str[i]);
        if (str[i] == '\0') {
            printf("'\\0'\n");
        } else {
            printf("'%c'\n", str[i]);
        }
    }
}


/* ============================================================
 * MAIN FUNCTION
 * ============================================================ */

int main() {
    printf("╔═══════════════════════════════════════════════════════════════╗\n");
    printf("ā•‘              STRING BASICS - EXAMPLES                         ā•‘\n");
    printf("ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•\n\n");
    
    example1_declaration();
    example2_null_terminator();
    example3_strlen_vs_sizeof();
    example4_modifiable();
    example5_output();
    example6_access();
    example7_iteration();
    example8_length();
    example9_escape();
    example10_concatenation();
    example11_mistakes();
    example12_empty_null();
    example13_memory();
    
    printf("\n═══════════════════════════════════════════════════════════════\n");
    printf("All examples completed!\n");
    printf("═══════════════════════════════════════════════════════════════\n");
    
    return 0;
}

Skill Check

Test this lesson

Answer 4 quick questions to lock in the lesson and feed your adaptive practice queue.

--
Score
0/4
Answered
Not attempted
Status
1

Which module does this lesson belong to?

2

Which section is covered in this lesson content?

3

Which term is most central to this lesson?

4

What is the best way to use this lesson for real learning?

Your answers save locally first, then sync when account storage is available.
Practice queue