forked from emilytouchingcomputers/CTFium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchall.c
executable file
·143 lines (110 loc) · 2.45 KB
/
chall.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdlib.h>
#include <errno.h>
#define ARR_LEN 10
long int get_num(){
long int num;
if( (scanf("%ld",&num)) != 1){
num = -1;
}
while ((getchar()) != '\n');
return num;
}
long int *get_numbers(){
/* we're in 2k19, we only want the big stuff */
long int cnt, *data = 0, tmp;
int ret = 0;
/* Ask the user how many values he's going to enter */
printf("How many values do you want to enter?\n>");
cnt = get_num();
/* Allocate some memory using calloc
cnt + 1 to also store the cnt in data[0] */
data = calloc(cnt + 1, sizeof(*data));
if (data == NULL){
printf("No, no...");
exit(0);
}
data[0] = cnt;
/* Read from the user and store the values inside the allocated memory */
for(int i=1; i < cnt + 1; i++){
if( (tmp = get_num()) == -1){
break;
}
data[i] = tmp;
}
return data;
}
void print_average(long int **data){
int idx = 0;
long int sum = 0;
printf("average at which idx?\n>");
idx = get_num();
/* security */
if(!(0 <= idx < ARR_LEN) || data[idx] == NULL){exit(0);}
/* Sum up all values and divide them by the number of values */
for(int i = 1; i < (data[idx][0] + 1); i++){
sum += data[idx][i];
}
printf("The average is: %lf\n",(double)sum / data[idx][0]);
}
void delete_numbers(long int ** numbers){
int idx;
printf("delete at which idx?\n>");
idx = get_num();
/* security */
if(0 <= idx < ARR_LEN && numbers[idx] != NULL){
free(numbers[idx]);
/* security! */
numbers[idx] = NULL;
} else {
printf("Try harder, lil fella\n");
}
}
void print_menu(){
printf("------------------\n");
printf("What do?\n");
printf("1) get numbers\n");
printf("2) print_average\n");
printf("3) delete_numbers\n>");
}
int get_next_index(long ** numbers){
for(int i = 0; i < ARR_LEN; i++){
if(numbers[i] == NULL){
return i;
}
}
return -1;
}
int main(){
int slot;
long int *data;
long int **numbers = calloc(ARR_LEN,sizeof(**numbers));
int num, ret;
setvbuf( stdout , NULL , _IONBF , 0);
for(int i=0; i < 50; i++){
print_menu();
num = get_num();
switch(num){
case 1:
slot = get_next_index(numbers);
if(slot == -1){
printf("delete first plox\n");
break;
}
data = get_numbers();
numbers[slot] = data;
break;
case 2:
print_average(numbers);
break;
case 3:
delete_numbers(numbers);
break;
default:
break;
}
}
free(numbers);
}