본문 바로가기
C언어

C언어_문자열 입력받아 거꾸로 출력 #수행4

by JiaLee0707 2020. 4. 14.

1학년 2학기 수행평가 4번 문제


4. 문자열을 입력받아 거꾸로 출력하는 프로그램을 작성하시오.

 조건 1. 문자열 순서를 거꾸로 바꾸는 함수를 작성하여 이용.

 조건 2. 모든 출력을 main() 함수에서만 하도록 한다.

 

전체소스

더보기
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* string(char* s) {
	int size = (int)strlen(s);	// 입력받은 문자열 길이
	char* cc = (char*)malloc(size);	// 문자열 거꾸로 받을 변수 동적할당
	//memset(cc, 0, sizeof(char) * size);	// malloc 초기화

	// for문을 통해
	// 입력받은 문자열 끝부터 변수에 대입
	for (int i = 0; i < size; i++) {
		*(cc + i) = *(s + size - 1 - i);
	}
	cc[size] = '\0';	// 쓰레기값이 출력되지 않도록 문자열 끝에 NULL 대입
		
	return cc;
}

int main(void) {
	char c[100];
	printf("영문자 입력 : ");
	//scanf("%s", c);	// 공백을 입력받지 못함
	gets_s(c, 100);

	printf("변환된 문자 : %s\n", string(c));
}

 

1.  main() 함수

가장 먼저 main() 함수를 작성.

조건에서 모든 출력은 main함수에서만 해야하니 출력문을 작성하자.

 

그리고 거꾸로 할 문자열 입력을 받자.

타입은 char고 길이는 대충 100을 준다. 길이는 자기 마음대로.

 

그리고 여기가 중요하다

대부분 입력을 받는다고 하면 scanf()를 쓸것이다. (아님말고...)

하지만 scanf()는 공백을 입력받지 못한다.

그래서 scanf()를 사용한다면 공백에서 문자열 입력이 끝나버린다.

scanf()로 입력을 받았을 때

 

그래서 우리는 공백도 함께 입력받을 수 있는 gets_s()를 사용할 것이다.

* gets_s(변수명, 변수 크기);

 

#include <stdio.h>

int main(void) {
	char c[100];
	printf("영문자 입력 : ");
	//scanf("%s", c);	// 공백을 입력받지 못함
	gets_s(c, 100);

	printf("변환된 문자 : %s\n", string(c));
}

 

2. 문자열을 거꾸로 해주는 함수 작성

main() 함수에서 문자열을 거꾸로 해주는 함수를 호출해줘야 한다.

그럴려면 함수를 먼저 작성해보자.

 

매개변수에는 입력받은 문자을 포인터로 받자.

 

이제 문자열을 거꾸로 해서 넣을 변수를 생성해야한다.

그럴러면 입력받은 문자열의 길이를 알아야 하므로 길이를 구하자.

 

길이는 strlen()으로 구할 수 있다.

*strlen(길이를 구할 변수);

 

strlen()를 사용할려면 헤더에

#include <string.h>를 작성해줘야 한다.

 

길이를 구했으면 문자열을 거꾸로 받은 변수를 생성하자.

이 변수는 malloc로 동정할당을 받는다.

 

그 다음 이제 for문을 통해

문자열의 인텍스별로 변수에 대입해준다.

 

여기서 중요한 문제!!

문자열을 거꾸로 대입하고 리턴까지 해준 다음,

main() 함수에서 결과를 출력하면 뒤에 이상한 글자들, 쓰레기 값들이 나온다.

그럼 이걸 어떻게 해결해야 하나?

2가지 방법이 있다.

 

1. malloc 초기화

malloc 초기화는 변수를 생성한 후 원하는 값으로 초기화를 해주는 것이다.

malloc를 초기화 하는 방법은 memset()를 사용한다.

* memset(변수명, 초기화할 값, 변수 사이즈);

 

2. NULL 대입

NULL 대입은 그냥

문자열을 거꾸로 다 대입을 해준 다음에,

그냥 출력하면 문자열 뒤에 쓰레기 값이 출력되니까

문자열 마지막에 NULL을 대입해주는 방식이다.

NULL을 대입해 줄 때는, '\0'로 해주면 된다.

 

char* string(char* s) {
	int size = (int)strlen(s);	// 입력받은 문자열 길이
	char* cc = (char*)malloc(size);	// 문자열 거꾸로 받을 변수 동적할당
	//memset(cc, 0, sizeof(char) * size);	// malloc 초기화

	// for문을 통해
	// 입력받은 문자열 끝부터 변수에 대입
	for (int i = 0; i < size; i++) {
		*(cc + i) = *(s + size - 1 - i);
	}
	cc[size] = '\0';	// 쓰레기값이 출력되지 않도록 문자열 끝에 NULL 대입
		
	return cc;
}

 

이제 소스 코드 완성이다.

이렇게 작성 후 소스코드를 돌려보면 맨 위와 같은 결과값이 나타날 것이다.

 

오늘의 문제 끝!

댓글