Есть ли альтернативные реализации GNU getline интерфейс?

Вот простой скрипт, который работает для вашего примера. Очевидно, вы хотели бы больший корпус правильных слов. Кроме того, вы, вероятно, захотите иметь ветку elif, которая оглянулась бы на предыдущее слово, если присоединение к следующему слову не смогло исправить не-слово.

from string import punctuation

word_list = "big list of words including a programming language is general purpose"
valid_words = set(word_list.split())

bad = "Java is a prog ramming lan guage. C is a gen eral purpose la nguage."
words = bad.split()

out_words = []
i = 0
while i < len(words):
    word = words[i]
    if word not in valid_words and i+1 < len(words):
        next_word = words[i+1]
        joined = word + next_word
        if joined.strip(punctuation) in valid_words:
            word = joined
            i += 1
    out_words.append(word)
    i += 1

good = " ".join(out_words)
print(good)
11
задан Keith Thompson 1 July 2013 в 15:07
поделиться

1 ответ

Я озадачен.

Я посмотрел ссылку, прочитал описание, и это хорошая утилита.

Но вы говорите просто могу переписать эту функцию в спецификации? Спецификация кажется довольно ясной,

Здесь:

/* This code is public domain -- Will Hartung 4/9/09 */
#include <stdio.h>
#include <stdlib.h>

size_t getline(char **lineptr, size_t *n, FILE *stream) {
    char *bufptr = NULL;
    char *p = bufptr;
    size_t size;
    int c;

    if (lineptr == NULL) {
        return -1;
    }
    if (stream == NULL) {
        return -1;
    }
    if (n == NULL) {
        return -1;
    }
    bufptr = *lineptr;
    size = *n;

    c = fgetc(stream);
    if (c == EOF) {
        return -1;
    }
    if (bufptr == NULL) {
        bufptr = malloc(128);
        if (bufptr == NULL) {
            return -1;
        }
        size = 128;
    }
    p = bufptr;
    while(c != EOF) {
        if ((p - bufptr) > (size - 1)) {
            size = size + 128;
            bufptr = realloc(bufptr, size);
            if (bufptr == NULL) {
                return -1;
            }
        }
        *p++ = c;
        if (c == '\n') {
            break;
        }
        c = fgetc(stream);
    }

    *p++ = '\0';
    *lineptr = bufptr;
    *n = size;

    return p - bufptr - 1;
}

int main(int argc, char** args) {
    char *buf = NULL; /*malloc(10);*/
    int bufSize = 0; /*10;*/

    printf("%d\n", bufSize);
    int charsRead =  getline(&buf, &bufSize, stdin);

    printf("'%s'", buf);
    printf("%d\n", bufSize);
    return 0;
}

15 минут, и я не писал C за 10 лет. Он незначительно нарушает контракт getline в том смысле, что он только проверяет, равен ли lineptr NULL, а не NULL и n == 0. Вы можете исправить это, если хотите. (Другой случай не имел большого смысла для меня, я думаю, вы могли бы вернуть -1 в этом случае.)

Заменить '\ n' на переменную для реализации "getdelim".

Do люди все еще пишут код?

16
ответ дан 3 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: