├── makefile └── rollingStrings.c /makefile: -------------------------------------------------------------------------------- 1 | 2 | all:rollingStrings 3 | 4 | rollingStrings:rollingStrings.o 5 | gcc rollingStrings.o -o rollingStrings -Wall -g -std=gnu99 6 | 7 | rollingStrings.o:rollingStrings.c 8 | gcc rollingStrings.c -c -Wall -g -std=gnu99 9 | 10 | clean: 11 | rm -fr rollingStrings rollingStrings.o 12 | -------------------------------------------------------------------------------- /rollingStrings.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define SIZE 14 6 | #define LINE 100 7 | 8 | char *arrayOfStrings[SIZE]; 9 | int j = 0; 10 | int full = 0; 11 | 12 | 13 | char *readOneStr(FILE *fp, int *err); 14 | 15 | // insert string and resort array 16 | void insertStr(char *r) 17 | { 18 | int i = 0; 19 | int k = 0; 20 | char *tmp = NULL; 21 | if (j == SIZE) { 22 | // replace first str 23 | free(arrayOfStrings[0]); 24 | for (i = 0; i < SIZE-1; i++) { 25 | arrayOfStrings[i] = arrayOfStrings[i+1]; 26 | } 27 | // insert new str 28 | arrayOfStrings[j-1] = r; 29 | } 30 | else { 31 | // insert new str 32 | arrayOfStrings[j++] = r; 33 | } 34 | 35 | // sort the strs 36 | for (i = 0; i < j; i++) { 37 | for (k = i; k < j; k++) { 38 | if (arrayOfStrings[i] == NULL || arrayOfStrings[k] == NULL) 39 | continue; 40 | if (strcmp(arrayOfStrings[i], arrayOfStrings[k]) > 0) { 41 | tmp = arrayOfStrings[i]; 42 | arrayOfStrings[i] = arrayOfStrings[k]; 43 | arrayOfStrings[k] = tmp; 44 | } 45 | } 46 | } 47 | } 48 | 49 | char *readOneStr(FILE *fp, int *err) 50 | { 51 | int n = 0; 52 | char c; 53 | int i = 0; 54 | char *r = NULL; 55 | char buf[LINE]; 56 | int ret = 0; 57 | int k; 58 | 59 | while (1) { 60 | // if file is end, return NULL 61 | if (feof(fp)) return NULL; 62 | // read n 63 | ret = fscanf(fp, "%d", &n); 64 | // if n is negative, return NULL 65 | if (ret == -1) return NULL; 66 | if (n > 0) { 67 | // alloc memory for str 68 | r = (char *) malloc(sizeof(char) * (n + 1)); 69 | // init str 70 | memset(r, 0, sizeof(char) * (n + 1)); 71 | if (r == NULL) return NULL; 72 | // read str 73 | fscanf(fp, "%s", buf); 74 | strncpy(r, buf, n); 75 | 76 | insertStr(r); 77 | // output current strings 78 | printf("Current strings:\n 0: HEAD\n"); 79 | for (k = 0; k < SIZE; k++) { 80 | if (arrayOfStrings[k] == NULL) { 81 | printf(" %d: \n", k + 1); 82 | } else { 83 | printf(" %d: %s\n", k + 1, arrayOfStrings[k]); 84 | } 85 | } 86 | printf(" %d: TAIL\n", k + 1); 87 | for (i = n; i < strlen(buf); i++) { 88 | c = buf[i]; 89 | printf("OOPS: Non-numeric input detected. The byte was: 0x%x='%c'.\n", c, c); 90 | *err = 1; 91 | } 92 | break; 93 | } else if (n < 0) { 94 | printf("OOPS: The length read from input, %d, was zero or negative.\n", n); 95 | } 96 | } 97 | 98 | return r; 99 | } 100 | 101 | 102 | int main(int argn, char *argv[]) { 103 | 104 | int i; 105 | int k; 106 | FILE *fp; 107 | int err = 0; 108 | char *ret = NULL; 109 | printf("There are %d command-line arguments\n", argn-1); 110 | for (k = 0; k < SIZE; k++) { 111 | arrayOfStrings[k] = NULL; 112 | } 113 | for (i = 1; i < argn; i++) { 114 | // open file 115 | fp = fopen(argv[i], "r"); 116 | if (fp == NULL) { 117 | fprintf(stderr, "ERROR: Cannot open the file '%s'\n", argv[i]); 118 | } 119 | else { 120 | printf("--- FILE: %s (argv[%d]) ---\n", argv[i], i); 121 | do { 122 | // read one str 123 | ret = readOneStr(fp, &err); 124 | } while (ret != NULL); 125 | printf("--- END OF FILE ---\n"); 126 | 127 | fclose(fp); 128 | } 129 | } 130 | // free memory 131 | for (k = 0; k < SIZE; k++) { 132 | if (arrayOfStrings[k] != NULL) { 133 | free(arrayOfStrings[k]); 134 | arrayOfStrings[k] = NULL; 135 | } 136 | } 137 | return err; 138 | } 139 | --------------------------------------------------------------------------------