Words from neighbour ones: Difference between revisions
C code efficiency improved
m (→{{header|REXX}}: added some wording to the REXX section header.) |
(C code efficiency improved) |
||
Line 76:
</pre>
=={{header|C}}==
<lang c>#include <
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Line 83 ⟶ 84:
#define MIN_LENGTH 9
#define WORD_SIZE (MIN_LENGTH + 1)
#define BUFFER_SIZE (MIN_LENGTH + 1)
}
struct word_buffer {
};
return ptr;▼
void word_buffer_init(struct word_buffer* buffer) {
buffer->end = 0;
}
void word_buffer_append(struct word_buffer* buffer, const char* word) {
buffer->end = (buffer->end + 1) % BUFFER_SIZE;
if (buffer->start == buffer->end)
buffer->start = (buffer->start + 1) % BUFFER_SIZE;
return ptr;▼
}
return
}
const char* word_buffer_get(const struct word_buffer* buffer, size_t index) {
return buffer->words[(index + buffer->start) % BUFFER_SIZE];
}
bool word_buffer_contains(const struct word_buffer* buffer, const char* word) {
const size_t n = word_buffer_size(buffer);
if (word_compare(word, word_buffer_get(buffer, i)) == 0)
}
// The input file must consist of one word per line in alphabetical order.
int main(int argc, char** argv) {
const char* filename = argc < 2 ? "unixdict.txt" : argv[1];
Line 115 ⟶ 133:
}
char line[MAX_WORD_SIZE];
struct word_buffer words;
word_buffer_init(&words);
▲ char* words = xmalloc(WORD_SIZE * capacity);
char prev_word[WORD_SIZE] = { 0 };▼
int count = 0;
while (fgets(line, sizeof(line), in)) {
size_t len = strlen(line) - 1; // last character is newline
Line 122 ⟶ 142:
continue;
line[len] = '\0';
if (word_buffer_size(&words) <
▲ memcpy(&words[size * WORD_SIZE], line, WORD_SIZE);
▲ int count = 0;
▲ char prev_word[WORD_SIZE] = { 0 };
▲ for (size_t i = 0; i + MIN_LENGTH <= size; ++i) {
char word[WORD_SIZE] = { 0 };
for (size_t
word[
if (word_compare(word, prev_word) == 0)
continue;
if (
printf("%2d. %s\n", ++count, word);
memcpy(prev_word, word, WORD_SIZE);
}
return EXIT_SUCCESS;
}</lang>
|