From 19bbd273058f79cf0c41c2a6fffcd63d308fd362 Mon Sep 17 00:00:00 2001 From: Adorn Binoy <ajb527@drexel.edu> Date: Fri, 17 Jan 2025 16:29:56 -0500 Subject: [PATCH] First homework assignment --- 1-C-Refresher/makefile | 20 +++ 1-C-Refresher/stringfun | Bin 0 -> 19640 bytes 1-C-Refresher/stringfun.c | 265 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 285 insertions(+) create mode 100644 1-C-Refresher/makefile create mode 100755 1-C-Refresher/stringfun create mode 100644 1-C-Refresher/stringfun.c diff --git a/1-C-Refresher/makefile b/1-C-Refresher/makefile new file mode 100644 index 0000000..98655da --- /dev/null +++ b/1-C-Refresher/makefile @@ -0,0 +1,20 @@ +# Compiler settings +CC = gcc +CFLAGS = -Wall -Wextra -g + +# Target executable name +TARGET = stringfun + +# Default target +all: $(TARGET) + +# Compile source to executable +$(TARGET): stringfun.c + $(CC) $(CFLAGS) -o $(TARGET) $^ + +# Clean up build files +clean: + rm -f $(TARGET) + +# Phony targets +.PHONY: all clean \ No newline at end of file diff --git a/1-C-Refresher/stringfun b/1-C-Refresher/stringfun new file mode 100755 index 0000000000000000000000000000000000000000..163914fd7bab18843084bcbbd5b82eda185bb8a9 GIT binary patch literal 19640 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 Bg%kh) literal 0 HcmV?d00001 diff --git a/1-C-Refresher/stringfun.c b/1-C-Refresher/stringfun.c new file mode 100644 index 0000000..239b4b3 --- /dev/null +++ b/1-C-Refresher/stringfun.c @@ -0,0 +1,265 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#define BUFFER_SZ 50 + +//prototypes +void usage(char *); +void print_buff(char *, int); +int setup_buff(char *, char *, int); +int count_words(char *, int, int); + +// Implementatino of the setup buff as per the directions +int setup_buff(char *buff, char *user_str, int len) { + char *dest = buff; // Pointer to the buffer + char prevChar = ' '; // Tracks previous character for spaces + int charCounter = 0; // Number of characters processed + + // Null check for input string + if (user_str == NULL) { + printf("Error: Null input string.\n"); + return -1; + } + + // Process user_str and fill the buffer + while (*user_str != '\0' && charCounter < len) { + // Copy every nonwhite space character into internal buffer and updates variables + if (*user_str != ' ' && *user_str != '\t') { + *dest = *user_str; + dest++; + charCounter++; + prevChar = *user_str; + } + // Checks for double space and replaces with single space + else if (prevChar != ' ') { + *dest = ' '; + dest++; + charCounter++; + prevChar = ' '; + } + // Increments input pointer to next memory location + user_str++; + } + + // Checks for the user supplied string being too large (end never reached) + if (*user_str != '\0') { + printf("Error: Provided input string is too long.\n"); + return -1; + } + + // Fill the rest of the buffer with dots + while (charCounter < len) { + *dest = '.'; + dest++; + charCounter++; + } + + // If no errors, return the length of the user supplied string + return charCounter; +} + +// Function to print the entire buffer +void print_buff(char *buff, int len) { + printf("Buffer: %.*s\n", len, buff); +} + +void usage(char *exename) { + printf("usage: %s [-h|c|r|w|x] \"string\" [other args]\n", exename); +} + +int count_words(char *buff, int len, int str_len) { + // Exit if string length greater than the buffer length + if (str_len > len) { + return -1; + } + + // Exit if the string is empty + if (str_len == 0) { + return 0; + } + + int totalWords = 0; + + // Loops through the buffer and updates totalWords based on current/previous character being a space + for (int i = 0; i < str_len; i++) { + if (buff[i] != ' ' && (i == 0 || buff[i - 1] == ' ')) { + totalWords++; + } + } + + return totalWords; +} + +void reverseString(char *buff, int str_len) { + int actual_length = 0; + for (int i = 0; i < str_len; i++) { + if (buff[i] != '.') { + actual_length++; + } else { + break; + } + } + + char *start = buff; + char *end = buff + actual_length - 1; + + while (start < end) { + char temp = *start; + *start = *end; + *end = temp; + start++; + end--; + } +} + +void printWords(char *buff, int str_len) { + int wordCounter = 0; // Index of the word from the input + int startIndex = -1; // Tracks the start index of the word + + printf("Word Print\n----------\n"); + + for (int i = 0; i < str_len; i++) { + // Ignore dots explicitly + if (buff[i] == '.') { + if (startIndex != -1) { + // Print the current word and reset startIndex + printf("%.*s (%d)\n", i - startIndex, &buff[startIndex], i - startIndex); + startIndex = -1; + } + continue; + } + + // Start of a new word. Keep track of characters. + if (buff[i] != ' ') { + if (startIndex == -1) { + wordCounter++; + startIndex = i; + printf("%d. ", wordCounter); + } + } + // End of the current word. Reset the index for the next word + else if (startIndex != -1) { + printf("%.*s (%d)\n", i - startIndex, &buff[startIndex], i - startIndex); + startIndex = -1; + } + } + + // Prints output for the last word if it exists. + if (startIndex != -1) { + printf("%.*s (%d)\n", str_len - startIndex, &buff[startIndex], str_len - startIndex); + } +} + + +int main(int argc, char *argv[]) { + char *buff; // Placeholder for the internal buffer + char *input_string; // holds the string provided by the user on cmd line + char opt; // used to capture user option from cmd line + int rc; // used for return codes + int user_str_len; // length of user supplied string + + //TODO: #1. WHY IS THIS SAFE, aka what if argv[1] does not exist? + // This code is safe because the first part of the if statement checks to make ensure if there are enough arguments. + // So if this first test fails, the second part won't be ran and the code exits. + if ((argc < 2) || (*argv[1] != '-')) { + printf("Error: Invalid option. Please try again.\n"); + usage(argv[0]); + exit(1); + } + + opt = (char)*(argv[1] + 1); + + // handle the help flag and then exit normally + if (opt == 'h') { + usage(argv[0]); + exit(0); + } + + //TODO: #2 Document the purpose of the if statement below + // This if statement makes sure that an input string is provided along with the command. + if (argc < 3) { + printf("Error: Missing input string.\n"); + usage(argv[0]); + exit(1); + } + + input_string = argv[2]; + + //TODO: #3 Allocate space for the buffer using malloc and + // handle error if malloc fails by exiting with a + // return code of 99 and prints error message. + buff = (char *)malloc(BUFFER_SZ * sizeof(char)); + if (buff == NULL) { + printf("Error: Memory allocation failed.\n"); + exit(99); + } + + // Initialize buffer + for (int i = 0; i < BUFFER_SZ; i++) { + buff[i] = '.'; + } + + user_str_len = setup_buff(buff, input_string, BUFFER_SZ); + if (user_str_len < 0) { + printf("Error setting up buffer, error = %d", user_str_len); + exit(2); + } + + switch (opt) { + case 'c': + rc = count_words(buff, BUFFER_SZ, user_str_len); // you need to implement + if (rc < 0) { + printf("Error counting words, rc = %d", rc); + exit(2); + } + printf("Word Count: %d\n", rc); + break; + + case 'r': + reverseString(buff, user_str_len); + // Print the reversed string without the dots + printf("Reversed String: "); + for (int i = 0; i < user_str_len; i++) { + if (buff[i] != '.') { + putchar(buff[i]); + } + } + printf("\n"); + break; + + case 'w': + printWords(buff, user_str_len); + break; + + case 'x': + if (argc < 5) { + printf("Error: Not enough arguments\n"); + exit(1); + } + + printf("Not implemented!\n"); + break; + + //TODO: #5 Implement the other cases for 'r' and 'w' by extending + // the case statement options + default: + usage(argv[0]); + exit(1); + } + + //TODO: #6 Don't forget to free your buffer before exiting + print_buff(buff, BUFFER_SZ); + free(buff); + exit(0); +} + +//TODO: #7 Notice all of the helper functions provided in the +// starter take both the buffer as well as the length. Why +// do you think providing both the pointer and the length +// is a good practice, after all we know from main() that +// the buff variable will have exactly 50 bytes? +// +// Passing the length makes it so that buffer overflows can be prevented since the helper functions are not aware of the size that is defined in main. +// It reduces risk and makes the code more future proof in case the size of the buffer changes. +// Finally, it makes the code more readable as the function's purpose can be observed easier and clearly. -- GitLab