openlang

포인터를 통해 문자 배열 입력받기

키보드에서 char 배열들로 입력을 받으려고 하면 프로그램이 계속 죽습니다.

키보드에서 char 배열을 읽어서 저장하는 간단한 방법이 뭘까요?

int main() {
    int pos;
    char *labels[8];
    for (pos=0; pos<8; ++pos) {
        scanf("%s",labels[pos]);
    }
    for (pos=0; pos<8; ++pos) {
        printf("%s\n",labels[pos]);
    }
    return 0;
}
영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    char *labels[8] 선언은 포인터 배열을 만듭니다. 유효한 주소로 초기화하지 않으면 그 포인터들은 유효하지 않은 메모리 위치를 가리킵니다. 따라서 그 포인터로 쓰기를 시도하면 정의되지 않은 동작이 발생합니다.

    포인터를 사용하기 전에 할당된 유효한 메모리 위치를 가리키는지 확인해야 합니다.

    영어에서 번역원문 보기
  2. 고유 링크

    char를 가리키는 포인터들의 배열이지만, 그 포인터들은 유효한 메모리를 가리키지 않습니다.

    먼저 포인터들이 쓸 저장 공간을 할당하세요:

    int main(void)
        int pos;
        char *labels[8];
        for (pos=0; pos<8; ++pos) {
            labels[pos]=malloc(LABELCAP);
            scanf("%17s",labels[pos]);
        }
        for (pos=0; pos<8; ++pos) {
            printf("%s\n",labels[pos]);
            free(labels[pos]);
        }
        return 0;
    }

    또 다른 방법은

    int main(void) {
        int pos;
        char labels[8][LABELCAP];
        for (pos=0; pos<8; ++pos) {
            scanf("%17s",labels[pos]);
        }
        for (pos=0; pos<8; ++pos) {
            printf("%s\n",labels[pos]);
        }
        return 0;
    }
    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 같은 sink 호출인데 한 번은 복사, 한 번은 이동

    Nim 2는 복사냐 이동이냐를 호출 지점마다 정한다. proc 단위로 정하지 않는다. 같은 인자, 같은 proc. 첫 호출은 a가 아직 쓰이니 복사한다. 둘째 호출은 이동한다. 호출 지점에는 어느 쪽인지 아무 표시가 없다.…

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

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

    답글 2최근 활동 rust
  3. 전역 변수에 의존하지 않는 입력 함수를 만들 수 있나요?

    사용자 입력을 처리하고 걸러 낸 뒤, 호출한 함수에 결과 문자열을 돌려주는 함수를 만들고 싶습니다. 아래 예처럼 전역 변수를 선언하지 않고도 가능할까요?

    답글 2최근 활동 c