How to mask sensitive parts of a string (e.g. credit card numbers) in C

1 Answer

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

void mask_credit_card(const char *input, char *out, size_t out_size) {
    size_t len = strlen(input);

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

    // Copy original into output
    strcpy(out, input);

    // Count digits from the end
    int digits_seen = 0;

    for (int i = (int)len - 1; i >= 0; i--) {
        if (isdigit((unsigned char)out[i])) {
            digits_seen++;

            // Keep last 4 digits visible
            if (digits_seen > 4) {
                out[i] = '*';
            }
        }
    }
}

int main() {
    const char *cc = "1234-5678-9102-8888";
    char masked[64] = "";

    mask_credit_card(cc, masked, sizeof(masked));
    printf("%s\n", masked);
    
    masked[0] = '\0';
    mask_credit_card("1234567891028888", masked, sizeof(masked));
    printf("%s\n", masked);
    
    return 0;
}



/*
run:

****-****-****-8888
************8888

*/

 



answered Dec 23, 2025 by avibootz
...