C での私の人生の 3 週目で、最大 80 文字の長さの最大 100 語を取り込み、入力の平均語長を計算し、平均より大きい語を出力し、最後に、平均単語サイズを出力します。 編集: また、再帰的な出力方法である 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;
}