[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을 거꾸로 출력한다.
결과
'CS > C' 카테고리의 다른 글
[2021W C프로그래밍과 실습][연습문제 10-7] 포인터 활용해서 라이브러리 함수 사용하지 않고 문자배열 소문자 ↔ 대문자 변환하기 (0) | 2022.02.09 |
---|---|
[2021W C프로그래밍과 실습][연습문제 10-6] 개수를 알 수 없는 배열의 원소의 개수와 평균 구하기 (0) | 2022.02.09 |
[2021W C프로그래밍과 실습][예제] 구조체 배열 포인터를 매개변수로 하는 함수 - Bubble sort 함수 활용 (0) | 2022.02.09 |
[2021W C프로그래밍과 실습] 반복문 (0) | 2022.02.09 |
[2021W C프로그래밍과 실습] 제어문 (0) | 2022.02.09 |