openlang

Может ли функция ввода обойтись без глобальных переменных?

Хочу написать функцию, которая обрабатывает пользовательский ввод, фильтрует его и возвращает полученную строку вызвавшей её функции.

Можно ли сделать это без объявления глобальной переменной, как в примере ниже?

#include <stdio.h>

char entry[12]; // globals aren't appealing!
char *read_entry() {
    scanf("%s",entry);
    return entry;
}

int main(void) {
    printf("%s",read_entry());
}
Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Объявите указатель на символ внутри main() и передайте этот указатель в качестве аргумента read_entry().

    #include <stdio.h>
    
    char *read_entry(char *entry) {
        scanf("%s",entry);
        return entry;
    }
    
    int main(void) {
        char entry[12]; // Storage must be reserved
        printf("%s",read_entry(entry));
    }
    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Можно ли сделать это без объявления глобальной переменной, как в примере ниже?

    Да, разумеется, как показано в другом ответе.

    Но не стоит огульно объявлять все глобальные переменные unappealing, у них есть свои применения.

    Помните также, что C поддерживает область видимости модуля: внутри модуля объект доступен, а снаружи не виден. Такие переменные тоже заслуживают рассмотрения.

    Поэтому следующий вариант вполне разумен:

    #include <stdio.h>
    
    static char entry[12]; // Module scope is fine
    static char *read_entry() {
        scanf("%s",entry);
        return entry;
    }
    
    int main(void) {
        printf("%s",read_entry());
    }
    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Один и тот же вызов с sink, сначала копия, потом перенос

    Nim 2 решает, копировать или переносить, в каждой точке вызова. Не на уровне proc. Тот же аргумент, та же proc. Первый вызов…

    Ответы 2Последняя активность nim
  2. Отложить изменяемое заимствование блока очистки до его исполнения

    Как написать в Rust устойчивую к панике конструкцию, похожую на Java try { ... } finally { ... }, чтобы блоки try и finally м…

    Ответы 2Последняя активность rust
  3. Ввод массивов символов через указатели

    Когда пытаюсь вводить с клавиатуры данные в массивы char, программа каждый раз падает. Как можно удобно считывать с клавиатур…

    Ответы 2Последняя активность c