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. 첫 호출은 a가 아직 쓰이니 복사한다. 둘째 호출은 이동한다. 호출 지점에는 어느 쪽인지 아무 표시가 없다.…

    답글 2최근 활동 nim
  2. 정리 블록이 실제로 실행될 때까지 가변 빌림을 미루기

    Rust에서 Java의 try { ... } finally { ... }와 비슷하게 패닉에도 안전한 구조를 만들고, try와 finally 블록이 같은 값을 각각 가변으로 빌리게 하려면 어떻게 해야 하나요? 원하는 건 정상…

    답글 2최근 활동 rust
  3. 포인터를 통해 문자 배열 입력받기

    키보드에서 char 배열들로 입력을 받으려고 하면 프로그램이 계속 죽습니다. 키보드에서 char 배열을 읽어서 저장하는 간단한 방법이 뭘까요?

    답글 2최근 활동 c