프로그래밍 언어/C

C언어 24강) 문자열 포인터에 입력하기

happy_life 2020. 11. 13. 21:43

전 강에서 배열 형태의 문자열에 사용자 입력값을 저장해보았다. 이번에는 문자열 포인터 안에 입력 값을 저장해보자.

 

문자열 포인터를 선언하고, scanf 함수로 문자열을 덮어쓰기 해주면 되지 않을까?? 

 

●오류 코드예제

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>

int main()
{
    char *s = "Hello";    // 문자열 포인터를 선언하고 문자열 할당

    printf("문자열을 입력하세요: ");
    scanf("%s", s);    // 실행 에러

    printf("%s\n", s);

    return 0;
}

이런 식의 액세스 오류가 뜬다. 왜 이런 액세스가 뜰까? 결론부터 말하자면, s에 저장되는 메모리 주소는 쓰기가 아닌 읽기 전용이기 때문이다. scanf를 통해 덮어쓰기 하는 것은 쓰기이므로 안 되는 것이다.

 

키보드 입력으로 읽기전용 메모리를 수정할 수 없음.

그렇다면 어떻게 해야 할까?

읽기 전용이 아닌 메모리 자체를 할당해주면 되지 않을까? 바로 malloc 함수에서 그  해답을 찾을 수 있다!!

 

●코드 예제

#define _CRT_SECURE_NO_WARNINGS     // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    char *s1 = malloc(sizeof(char) * 9);    // char 9개 크기만큼 동적 메모리 할당

    printf("문자열을 입력하세요: ");
    scanf("%s", s1);      // 표준 입력을 받아서 메모리가 할당된 문자열 포인터에 저장
                          //s1의 주소에 들어가 입력된 문자열을 저장해준다.

    printf("%s\n", s1);   // 문자열의 내용을 출력

    free(s1);    // 동적 메모리 해제

    return 0;
}

결괏값