Used sscanf to simplify code

Instead of manually parsing out the game_id and raw_hand manually, use sscanf
This commit is contained in:
icaema 2023-12-02 23:05:37 -05:00
parent b8574fd4d6
commit 0f9839ef49
5 changed files with 19 additions and 34 deletions

View File

@ -12,9 +12,11 @@ run2: clean bin/part02
test1: clean bin/part01
cat data/p01test.txt | bin/part01
@echo "8 is correct answer"
test2: clean bin/part02
cat data/p02test.txt | bin/part02
@echo "2286 is correct answer"
bin/part01:
$(CC) src/part01.c -o bin/part01

Binary file not shown.

Binary file not shown.

View File

@ -66,30 +66,21 @@ int main(int argc, char *argv[]){
while (fgets(line, LINE_MAX, stdin) != NULL) {
int game_id;
char *raw_hand;
//debug_printf("raw line: %s\n", line);
char id_buf[4];
int colon_index = (int)(strchr(line, ':') - line);
strncpy(id_buf, &line[5], colon_index-5);
game_id = atoi(id_buf);
//debug_printf("id_buf: -%s- game_id: %d\n", id_buf, game_id);
sscanf(line, "Game %d: %m[0-9a-z,; ]\n", &game_id, &raw_hand);
gameArray[linesProcessed] = (Game){game_id, 0, {(Hand){0,0,0,0}}, (Hand){0,0,0,0}, 1};
char raw_hand_buffer[LINE_MAX]; //make a buffer to hold the rest of the game info for parsing later
memset(raw_hand_buffer, '\0', sizeof(raw_hand_buffer));
int end_index = (int)(strchr(line, '\n') - line); //debug_printf("endIndex: %d\n", end_index);
strncpy(raw_hand_buffer, &line[colon_index+2], end_index-(colon_index+2));
//debug_printf("game_id: %d; raw_hand_buffer: ~~%s~~\n", game_id, raw_hand_buffer);
debug_printf("Reconstruct: ~~Game %d: %s~~\n", game_id, raw_hand_buffer);
debug_printf("Reconstruct: ~~Game %d: %s~~\n", game_id, raw_hand);
int hand_index = 0;
char count_buf[10] = "";
memset(count_buf, '\0', sizeof(count_buf));
for (int i = 0; i<=strlen(raw_hand_buffer); i++){
char current_char = raw_hand_buffer[i];
//debug_printf("i: %d.%d, hand_index: %d; count_buf:~%s~; current_char: %c\n", i, strlen(raw_hand_buffer), hand_index, count_buf, current_char);
if (current_char == ';' || i == strlen(raw_hand_buffer)){
for (int i = 0; i<=strlen(raw_hand); i++){
char current_char = raw_hand[i];
//debug_printf("i: %d.%d, hand_index: %d; count_buf:~%s~; current_char: %c\n", i, strlen(raw_hand), hand_index, count_buf, current_char);
if (current_char == ';' || i == strlen(raw_hand)){
memset(count_buf, '\0', sizeof(count_buf));
gameArray[linesProcessed].hands[hand_index].set = 1;
gameArray[linesProcessed].num_hands = hand_index+1;
@ -112,6 +103,7 @@ int main(int argc, char *argv[]){
memset(count_buf, '\0', sizeof(count_buf));
}
}
free(raw_hand);
linesProcessed++;
}
printf("\n Ingested %d Lines\n", linesProcessed);

View File

@ -80,30 +80,21 @@ int main(int argc, char *argv[]){
while (fgets(line, LINE_MAX, stdin) != NULL) {
int game_id;
char *raw_hand;
//debug_printf("raw line: %s\n", line);
char id_buf[4];
int colon_index = (int)(strchr(line, ':') - line);
strncpy(id_buf, &line[5], colon_index-5);
game_id = atoi(id_buf);
//debug_printf("id_buf: -%s- game_id: %d\n", id_buf, game_id);
sscanf(line, "Game %d: %m[0-9a-z,; ]\n", &game_id, &raw_hand);
gameArray[linesProcessed] = (Game){game_id, 0, {(Hand){0,0,0,0}}, (Hand){0,0,0,0}, 1};
char raw_hand_buffer[LINE_MAX]; //make a buffer to hold the rest of the game info for parsing later
memset(raw_hand_buffer, '\0', sizeof(raw_hand_buffer));
int end_index = (int)(strchr(line, '\n') - line); //debug_printf("endIndex: %d\n", end_index);
strncpy(raw_hand_buffer, &line[colon_index+2], end_index-(colon_index+2));
//debug_printf("game_id: %d; raw_hand_buffer: ~~%s~~\n", game_id, raw_hand_buffer);
debug_printf("Reconstruct: ~~Game %d: %s~~\n", game_id, raw_hand_buffer);
debug_printf("Reconstruct: ~~Game %d: %s~~\n", game_id, raw_hand);
int hand_index = 0;
char count_buf[10] = "";
memset(count_buf, '\0', sizeof(count_buf));
for (int i = 0; i<=strlen(raw_hand_buffer); i++){
char current_char = raw_hand_buffer[i];
//debug_printf("i: %d.%d, hand_index: %d; count_buf:~%s~; current_char: %c\n", i, strlen(raw_hand_buffer), hand_index, count_buf, current_char);
if (current_char == ';' || i == strlen(raw_hand_buffer)){
for (int i = 0; i<=strlen(raw_hand); i++){
char current_char = raw_hand[i];
//debug_printf("i: %d.%d, hand_index: %d; count_buf:~%s~; current_char: %c\n", i, strlen(raw_hand), hand_index, count_buf, current_char);
if (current_char == ';' || i == strlen(raw_hand)){
memset(count_buf, '\0', sizeof(count_buf));
gameArray[linesProcessed].hands[hand_index].set = 1;
gameArray[linesProcessed].num_hands = hand_index+1;
@ -126,6 +117,7 @@ int main(int argc, char *argv[]){
memset(count_buf, '\0', sizeof(count_buf));
}
}
free(raw_hand);
linesProcessed++;
}
printf("\n Ingested %d Lines\n", linesProcessed);
@ -161,4 +153,3 @@ int main(int argc, char *argv[]){
printf("sum_of_valid_games: \n%d\n", sum_of_valid_games);
printf("sum_of_powers_of_min_cubes: \n%d\n", sum_of_powers_of_min_cubes);
}