Files
exc/med/C-programming-a-modern-standard/digitseen.c
T
2026-05-25 00:48:50 +02:00

94 lines
2.2 KiB
C

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
void numberprinter(int inarr[], int arrlength) {
for (int i = 0; i < arrlength; i++) {
printf("number%d: %d\n", i, inarr[i]);
}
}
struct Darray {
int *digits;
int length;
};
struct Darray *numbertodigitDarr(int input) {
// same calculation for arrsize
int op = 0;
int tempinput = input;
while (tempinput) {
tempinput /= 10;
op++;
}
// allocate memory for struct and array, apparently more ideomatic to have a single malloc
struct Darray *DigDarr =
malloc(op * sizeof(int) + sizeof(*DigDarr) + sizeof(int));
if (DigDarr == NULL) {
printf("allocation failed");
exit(0);
}
// forgot to assign a value to the pointer variable in the struct.
DigDarr->digits = (int *)(DigDarr + 1);
DigDarr->length = op;
// insert numbers into array in reverse order
for (int i = op - 1; i >= 0; i--) {
int last_digit = input % 10;
printf("last digit: %d\n", last_digit);
DigDarr->digits[i] = last_digit;
input /= 10;
}
return DigDarr;
}
//
void checkarrdupes(struct Darray input) {
for (int i = 0; i < input.length; i++) {
printf("digitstr: %d\n", input.digits[i]);
}
int digit_seen[10] = {};
// kijk door elke arr element
for (int i = 0; i < input.length; i++) {
// kijk of input[i] al in digit_seen zit
if (digit_seen[input.digits[i]]) {
printf("duplicate number: %d\n", input.digits[i]);
} else {
digit_seen[input.digits[i]] = 1;
}
}
}
int main(void) {
int n;
printf("enter a number: ");
// TODO: scanf is fragile. Try using fgets() and strtol() for robust input
// sanitization.
scanf("%d", &n);
int digitslength = 0;
struct Darray *mydigitsDarr = numbertodigitDarr(n);
checkarrdupes(*mydigitsDarr);
free(mydigitsDarr);
return 0;
}
/*
somehow I have to find a way to get the number of digits in my number
for now, we use modulo. whatever remains is the last digit of the number
we then divide by 10 to remove the last number
we can keep a counter, and we can put it into an array. however, if we use the
iterator (which has to start from 0, because we don't know the size of the
number?) then our number will be the wrong way around.
malloc, blijkbaar very different
*/