How to mask sensitive parts of a string (e.g. email addresses) in C

2 Answers

0 votes
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* maskEmail(const char* email) {
    const char* atPos = strchr(email, '@');
    if (!atPos) {
        // No '@' found → return copy of original
        return strdup(email);
    }

    size_t index = atPos - email;

    // Must have at least 2 characters before '@'
    if (index < 2) {
        return strdup(email);
    }

    // Allocate output string
    size_t len = strlen(email);
    char* result = malloc(len + 1);
    if (!result) return NULL;

    // First character stays
    result[0] = email[0];

    // Mask characters between first char and '@'
    for (size_t i = 1; i < index; i++) {
        result[i] = '*';
    }

    // Copy the rest (from '@' onward)
    strcpy(result + index, email + index);

    return result;
}

int main() {
    char* masked = maskEmail("john.doe@example.com");
    
    printf("%s\n", masked);
    
    free(masked);
    
    return 0;
}



/*
run:

j*******@example.com

*/

 



answered Dec 23, 2025 by avibootz
0 votes
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void mask_email(const char *email, char *out, size_t out_size) {
    const char *at = strchr(email, '@');
    if (!at) {
        // No '@' → copy as-is
        strncpy(out, email, out_size);
        out[out_size - 1] = '\0';
        return;
    }

    size_t prefix_len = at - email;
    size_t email_len = strlen(email);

    if (prefix_len < 2) {
        // Too short to mask → copy as-is
        strncpy(out, email, out_size);
        out[out_size - 1] = '\0';
        return;
    }

    if (email_len + 1 > out_size) {
        // Output buffer too small
        if (out_size > 0) out[0] = '\0';
        return;
    }

    // First character stays
    out[0] = email[0];

    // Mask characters between first char and '@'
    memset(out + 1, '*', prefix_len - 1);

    // Copy the rest (including '@' and domain)
    strcpy(out + prefix_len, email + prefix_len);
}


int main() {
    const char *email = "john.doe@example.com";
    char masked[256];

    mask_email(email, masked, sizeof(masked));

    printf("%s\n", masked);
    
    return 0;
}



/*
run:

j*******@example.com

*/

 



answered Dec 23, 2025 by avibootz
...