Итак, это третья неделя моей жизни на C, и мне поручили написать программу, которая принимает до 100 слов длиной до 80 символов, вычисляет среднюю длину входных данных, печатает слова большего размера, чем в среднем, и наконец печатает средний размер слова. EDIT: мы также должны использовать emalloc, метод рекурсивного вывода, и освободить всю используемую память.
Успех! ... или я так думал.
Я написал следующее в Eclipse, который использует gcc -E -P -v -dD
в качестве аргументов компиляции, и я не получаю ошибок времени выполнения при запуске программы с использованием предоставленных тестовых примеров.
Теперь я завершил код, который должен воспроизвести в течение 30-минутного практического занятия. Нам говорят, что мы должны использовать текстовый редактор и что gcc -W -Wall -ansi -pedantic
нужно будет использовать в качестве аргументов компиляции, но если я вместо этого использую эти аргументы, это означает, что моя программа всегда завершается с ошибкой шины.
РЕДАКТИРОВАТЬ: исправлено и отформатировано
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXIMUM_STRING_LENGTH 80
#define MAXIMUM_ARRAY_LENGTH 100
void* memory_allocation(size_t sizeof_memory_required) {
void* free_memory_pointer = malloc(sizeof_memory_required);
if (free_memory_pointer/*exists*/) {
return free_memory_pointer;
} else {
fprintf(stderr, "*** MEMORY ALLOCATION FAILURE ***\n");
exit(EXIT_FAILURE);
}
}
void print_larger_than_average_strings(char** string_pointers, int i, const double AVERAGE_STRING_LENGTH) {
if (string_pointers[i]/*exist*/) {
if (strlen(string_pointers[i]) > AVERAGE_STRING_LENGTH) {
printf("%s\n", string_pointers[i]);
}
print_larger_than_average_strings(string_pointers, ++i, AVERAGE_STRING_LENGTH);
} else {
fprintf(stderr, "%.2f\n", AVERAGE_STRING_LENGTH);
}
}
int main(void) {
int string_count = 0;
char string[MAXIMUM_STRING_LENGTH];
char* string_pointer[MAXIMUM_ARRAY_LENGTH];
int i;
double character_count;
while ((string_count < MAXIMUM_ARRAY_LENGTH) && (1 == scanf("%79s", string))) {
string_pointer[string_count] = memory_allocation(sizeof string_pointer[0][0] * (strlen(string) + 1));
strcpy(string_pointer[string_count++], string);
}
string_pointer[string_count] = NULL;
for (i = 0; i < string_count; i++) {
character_count += strlen(string_pointer[i]);
}
if (string_count/*exists*/) {
print_larger_than_average_strings(string_pointer, 0, character_count / string_count);
for (i = 0; i < string_count; i++) {
free(string_pointer[i]);
}
}
return EXIT_SUCCESS;
}