Finding Min/Max Values, String Manipulation, and Pointer Usage in C

Task 1.1: Finding Minimum and Maximum in an Array Using Pointers

This program reads five integers into an array, then finds the minimum and maximum values using a function that modifies values through pointer parameters.

#include <stdio.h>
#define SIZE 5

void read_array(int arr[], int len);
void print_array(int arr[], int len);
void get_min_max(int arr[], int len, int *min_ptr, int *max_ptr);

int main() {
    int numbers[SIZE];
    int min_val, max_val;

    printf("Enter %d integers:\n", SIZE);
    read_array(numbers, SIZE);

    printf("Input data:\n");
    print_array(numbers, SIZE);

    printf("Processing...\n");
    get_min_max(numbers, SIZE, &min_val, &max_val);

    printf("Results:\n");
    printf("min = %d, max = %d\n", min_val, max_val);
    return 0;
}

void read_array(int arr[], int len) {
    for (int i = 0; i < len; ++i)
        scanf("%d", &arr[i]);
}

void print_array(int arr[], int len) {
    for (int i = 0; i < len; ++i)
        printf("%d ", arr[i]);
    printf("\n");
}

void get_min_max(int arr[], int len, int *min_ptr, int *max_ptr) {
    *min_ptr = *max_ptr = arr[0];
    for (int i = 1; i < len; ++i) {
        if (arr[i] < *min_ptr)
            *min_ptr = arr[i];
        else if (arr[i] > *max_ptr)
            *max_ptr = arr[i];
    }
}

Task 1.2: Returning Pointer to Maximum Element

This version returns a pointer to the maximum element instead of its value.

#include <stdio.h>
#define SIZE 5

void read_array(int arr[], int len);
void print_array(int arr[], int len);
int* locate_max(int arr[], int len);

int main() {
    int numbers[SIZE];
    int *max_ptr;

    printf("Enter %d integers:\n", SIZE);
    read_array(numbers, SIZE);

    printf("Input data:\n");
    print_array(numbers, SIZE);

    printf("Processing...\n");
    max_ptr = locate_max(numbers, SIZE);

    printf("Maximum value: %d\n", *max_ptr);
    return 0;
}

void read_array(int arr[], int len) {
    for (int i = 0; i < len; ++i)
        scanf("%d", &arr[i]);
}

void print_array(int arr[], int len) {
    for (int i = 0; i < len; ++i)
        printf("%d ", arr[i]);
    printf("\n");
}

int* locate_max(int arr[], int len) {
    int max_idx = 0;
    for (int i = 1; i < len; ++i)
        if (arr[i] > arr[max_idx])
            max_idx = i;
    return &arr[max_idx];
}

Task 2.1: Swapping Strings Stored in Character Arrays

Demonstrates swapping contents of two fixed-size character arrays using strcpy.

#include <stdio.h>
#include <string.h>
#define MAX_LEN 80

int main() {
    char str1[MAX_LEN] = "Learning makes me happy";
    char str2[MAX_LEN] = "Learning makes me sleepy";
    char temp[MAX_LEN];

    printf("sizeof(str1) = %zu\n", sizeof(str1));
    printf("strlen(str1) = %zu\n", strlen(str1));

    printf("\nBefore swap:\n");
    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);

    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);

    printf("\nAfter swap:\n");
    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);
    return 0;
}

Task 2.2: Swapping Pointers to String Literals

Swaps pointers to string literals—no actual string content is moved in memory.

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

int main() {
    char *s1 = "Learning makes me happy";
    char *s2 = "Learning makes me sleepy";
    char *tmp;

    printf("sizeof(s1) = %zu\n", sizeof(s1));
    printf("strlen(s1) = %zu\n", strlen(s1));

    printf("\nBefore swap:\n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);

    tmp = s1;
    s1 = s2;
    s2 = tmp;

    printf("\nAfter swap:\n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    return 0;
}

Task 3: Accessing 2D Arrays via Different Pointer Types

Illustrates three ways to traverse a 2D array: direct indexing, element-wise pointer, and row-pointer.

#include <stdio.h>

int main() {
    int matrix[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
    int *elem_ptr;
    int (*row_ptr)[4];

    // Method 1: Direct indexing
    printf("Method 1: Direct access\n");
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 4; ++j)
            printf("%d ", matrix[i][j]);
        printf("\n");
    }

    // Method 2: Element-wise pointer
    printf("\nMethod 2: Element pointer\n");
    for (elem_ptr = &matrix[0][0], int idx = 0; elem_ptr < &matrix[0][0] + 8; ++elem_ptr, ++idx) {
        printf("%d ", *elem_ptr);
        if ((idx + 1) % 4 == 0) printf("\n");
    }

    // Method 3: Row pointer
    printf("\nMethod 3: Row pointer\n");
    for (row_ptr = matrix; row_ptr < matrix + 2; ++row_ptr) {
        for (int j = 0; j < 4; ++j)
            printf("%d ", *(*row_ptr + j));
        printf("\n");
    }
    return 0;
}

Task 4: Character Replacement in a String

Replaces all occurrences of a specified character with another (e.g., 'i' → '*').

#include <stdio.h>
#define MAX_LEN 80

void substitute_char(char *str, char target, char replacement);

int main() {
    char text[MAX_LEN] = "Programming is difficult or not, it is a question.";
    printf("Original: %s\n", text);
    substitute_char(text, 'i', '*');
    printf("Modified: %s\n", text);
    return 0;
}

void substitute_char(char *str, char target, char replacement) {
    while (*str) {
        if (*str == target)
            *str = replacement;
        str++;
    }
}

Task 5: Truncating a String at a Specified Character

Truncates the input string at the first occurrence of a given character by inserting '\0'.

#include <stdio.h>
#define MAX_LEN 80

char* truncate_at(char *str, char delimiter);

int main() {
    char input[MAX_LEN];
    char ch;
    while (printf("Enter string: "), fgets(input, MAX_LEN, stdin) != NULL) {
        input[strcspn(input, "\n")] = '\0'; // Remove newline
        printf("Enter delimiter: ");
        ch = getchar();
        while (getchar() != '\n'); // Clear input buffer
        truncate_at(input, ch);
        printf("Result: %s\n\n", input);
    }
    return 0;
}

char* truncate_at(char *str, char delimiter) {
    while (*str && *str != delimiter)
        str++;
    if (*str == delimiter)
        *str = '\0';
    return str;
}

Task 6: Validating Chinese ID Numbers

Checks if a string is a valid 18-digit Chinese ID: exactly 18 characters, first 17 are digits, last can be digit or 'X'.

#include <stdio.h>
#include <string.h>
#define COUNT 5

int validate_id(const char *id);

int main() {
    char *ids[COUNT] = {
        "31010120000721656X",
        "3301061996x0203301",
        "53010220051126571",
        "510104199211197977",
        "53010220051126133Y"
    };

    for (int i = 0; i < COUNT; ++i) {
        if (validate_id(ids[i]))
            printf("%s\tTrue\n", ids[i]);
        else
            printf("%s\tFalse\n", ids[i]);
    }
    return 0;
}

int validate_id(const char *id) {
    if (strlen(id) != 18)
        return 0;
    for (int i = 0; i < 17; ++i)
        if (id[i] < '0' || id[i] > '9')
            return 0;
    if (!(id[17] >= '0' && id[17] <= '9') && id[17] != 'X')
        return 0;
    return 1;
}

Task 7: Caesar Cipher Encoder and Decoder

Implements a Caesar cipher that shifts letters by n positions, with wrap-around. Handles both uppercase and lowercase.

#include <stdio.h>
#define MAX_LEN 80

void encode(char *text, int shift);
void decode(char *text, int shift);

int main() {
    char message[MAX_LEN];
    int n;

    printf("Enter plaintext: ");
    fgets(message, MAX_LEN, stdin);
    message[strcspn(message, "\n")] = '\0';

    printf("Enter shift value: ");
    scanf("%d", &n);

    printf("Original: %s\n", message);
    encode(message, n);
    printf("Encoded:  %s\n", message);
    decode(message, n);
    printf("Decoded:  %s\n", message);
    return 0;
}

void encode(char *text, int shift) {
    while (*text) {
        if (*text >= 'a' && *text <= 'z')
            *text = 'a' + (*text - 'a' + shift) % 26;
        else if (*text >= 'A' && *text <= 'Z')
            *text = 'A' + (*text - 'A' + shift) % 26;
        text++;
    }
}

void decode(char *text, int shift) {
    while (*text) {
        if (*text >= 'a' && *text <= 'z')
            *text = 'a' + (*text - 'a' - shift + 26) % 26;
        else if (*text >= 'A' && *text <= 'Z')
            *text = 'A' + (*text - 'A' - shift + 26) % 26;
        text++;
    }
}

Tags: C pointers Arrays strings string-manipulation

Posted on Wed, 19 Aug 2026 16:12:57 +0000 by bladecatcher