모두의 코드 커뮤니티

Scanf에 관한 사소한 문제

안녕하세요. 저는 C언어 scanf를 연속으로 사용하여 문자열을 받을 때 프로그램이 제대로 실행되지 않아 질문을 드립니다.

처음에 char* 형 변수 2개를 초기화하지 않고 선언한 뒤에 scanf를 통해 문자열이 저장되도록 했습니다. 그런데 첫 번째는 잘 입력되지만 입력한 후에는 프로그램에 오류가 생겼습니다. 저는 이것이 무슨 문제인지 몰라 여러 방법으로 다시 시도해 보았습니다. 그러다가 초기화하지 않은 char* 형 변수에 문자열을 지정하기 위해 strcpy 함수를 사용했는데 되지 않는 걸 보고 문뜩 저번에 strcpy 함수는 직접 제작했을 때, 어떤 곳을 이미 가리키고 있는 포인터에 값만 복사하하는데, 이건 char* 형 변수를 초기화하지 않아 이 변수가 가리키는 곳이 없어 복사가 안 되는 것이라고 생각했습니다.

그래서 변수에 동적 할당을 하고 실행해보니 제대로 실행되었습니다. 저는 처음에 scanf를 연속으로 사용해서 문자열을 지정할려고 했는데, 두 변수를 동적 할당하고 나니 프로그램이 제대로 작동하였습니다.

좀 길었지만 제 질문은 scanf 함수도 strcpy 함수처럼 포인터가 이미 어떤 메모리 주소를 가리키고 있어야 그 값이 전해지는 건가요?

좋아요 1

scanf 로 문자열을 입력 받으려면 문자열을 저장할 공간이 필요 합니다. 예를 들어서 입력 받은 문자열 길이가 100 바이트라면, 널 문자 까지 포함해서 101 바이트가 필요하겠죠. 따라서 scanf 를 사용하기 위해서는 메모리 상에 존재하는 실제 공간 을 전달해줘야 합니다.

예를 들어서

char str[101];
scanf("%s", str);

이렇게 말이죠.

만약에

char* str;
scanf("%s", str);

이렇게 하셨더라면 문제가 됩니다. 왜냐하면 str 은 현재 실제로 존재하는 공간을 나타내고 있고 있지 않기 때문이죠.