Advertisement
informaticage

Fix C input

May 5th, 2021
699
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define GROW_FACTOR 2
  5. #define INIT_SIZE 8
  6. #define NEW(kind, size) (kind*)reallocate(0, sizeof(kind) * size, NULL)
  7. #define GROW(kind, ptr, o, n) (kind*)reallocate(sizeof(kind) * o, sizeof(kind) * n, ptr)
  8.  
  9. void* reallocate(int oldsize, int newsize, void* ptr) {
  10.     /* Allocates/reallocates/deallocates a block
  11.     of memory using malloc, realloc and free */
  12.  
  13.     if (oldsize == 0 && ptr == NULL) {
  14.         return malloc(newsize);
  15.     }
  16.     else if (oldsize == 0 && ptr != NULL) {
  17.         free(ptr);
  18.         return NULL;
  19.     }
  20.     return realloc(ptr, newsize);
  21. }
  22.  
  23. char* reverse(char* str) {
  24.     /* Reverses a string. Returns a copy of the
  25.     string on success and a null pointer on
  26.     failure*/
  27.  
  28.     int len = strlen(str);
  29.     char* result = NEW(char, len);
  30.     if (result == NULL) {
  31.         return NULL;
  32.     }
  33.     memset(result, 0, len);
  34.     for (int i = len - 1; i >= 0; i--) {
  35.         result[len - i - 1] = str[i];
  36.     }
  37.  
  38.     result[len] = '\0';
  39.     return result;
  40. }
  41.  
  42.  
  43. char* input(char* prompt) {
  44.     /* Reads from stdin until a newline is pressed.
  45.     Returns null upon allocation failure, or a pointer
  46.     to char otherwise.
  47.     Prompt is an optional message to show to the user
  48.     */
  49.  
  50.     char* buffer = NEW(char, INIT_SIZE);
  51.     if (buffer == NULL) {
  52.         return NULL;
  53.     }
  54.     memset(buffer, 0, INIT_SIZE * sizeof(char));
  55.     char current;
  56.     int len = 0;
  57.     int buflen = INIT_SIZE * sizeof(char);
  58.     printf("%s", prompt);
  59.     while ((current = getchar()) != '\n') {
  60.         if (len == buflen) {
  61.             buflen = sizeof(char) * len * GROW_FACTOR;
  62.             buffer = GROW(char, buffer, len, buflen);
  63.             if (buffer == NULL) {
  64.                 return NULL;
  65.             }
  66.         }
  67.         buffer[len] = current;
  68.         len++;
  69.     }
  70.     // Ogni tanto non mette il demone finale della stringa
  71.     // if (len >= buflen) {
  72.     //     buffer[len] = '\0';
  73.     // }
  74.     buffer[len] = '\0';
  75.     return buffer;
  76. }
  77.  
  78.  
  79. int main(int argc, char* argv[]) {
  80.     /* I have no clue what I'm doing */
  81.  
  82.     char * buffer = input("> ");
  83.     char* reversed = reverse(buffer);
  84.     if (buffer == NULL) {
  85.         printf("Error reading input");
  86.         return -1;
  87.     }
  88.     if (reversed == NULL) {
  89.         printf("Error reversing input");
  90.         return -1;
  91.     }
  92.     printf("The reverse of '%s' is '%s'\n", buffer, reversed);
  93.     printf("Length of strings is %lu bytes\n", strlen(buffer));
  94.     free(buffer);
  95.     free(reversed);
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement