CS/C

[2021W C프로그래밍과 실습][연습문제 10-5] 포인터 활용 - 입력받은 문자열 거꾸로 출력하기, strlen() 없이 문자열의 크기 구하기

아이스얼그레이 2022. 2. 9. 22:20

[10-5] 키보드로부터 문자열을 입력 받아 이를 반대로(끝에서부터) 출력하는 프로그램을 포인터를 이용하여 작성하라. 또한 문자열의 크기를 구하여 함께 출력하도록 하라.

실습시험을 대비해서 연습문제랑 교수님이 준 예제를 풀고 블로그에 문제 분석글을 올려보려고 한다.

이 문제는 포인터를 이용해 입력받은 문자열을 반대로 출력하는 코드를 짜는 문제이다.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char str[20] = "";
	char* ptr;
	int i, cnt = 0;

	printf("Input String ? ");
	// scanf("%s", str); // scanf는 공백을 기준으로 입력받는구나!!
	gets(str);

	while (str[cnt] != NULL)
	{
		cnt++;
	}

	ptr = &str[cnt];

	for (i = 0; i <= cnt; i++)
	{
		printf("%c ", *(ptr - i));
	}

	printf("\n\n문자열의 크기 : %d", cnt);

	return 0;
}

우선 문자열을 입력하기 위해 str[20]을 정의했다. 배열의 크기는 적당한 크기로 지정했는데, 이는 메모리 동적할당을 이용해서 바꿔볼 수도 있겠다.

처음 코드에서는 scanf() 함수로 문자열을 받았는데, scanf() 함수는 공백을 기준으로 문자열을 입력받아서 띄어쓰기를 할 수 없다는 문제가 있었다. 그래서 문자열 입력함수인 gets()를 사용했다.

그 후 문자열의 크기를 구하기 위해 while문을 작성했다. str[cnt]가 NULL이 아니면 cnt를 늘려가며 쓰레기값이 아닌 문자의 개수를 cnt에 저장하는 코드이다.

그리고 ptr = &str[cnt] 을 써서 str[cnt]의 주소를 ptr에 저장한다. 여기서 좀 헷갈렸는데, *ptr에 문자열을 복사하는게 아닌 ptr에 주소를 저장한다. 그러면 ptr - 1 == &str[cnt - 1]이 되어서 반복문을 이용해 거꾸로 출력할 수 있다.

그 뒤로는 ptr을 1씩 줄여가며 입력받은 str을 거꾸로 출력한다.

결과