참고 사이트
제한조건
- string 변환 함수를 제외한 모든 함수는 iostream 헤더파일로만 구현
- trans_str()는 함수 내에서 std::cout 출력하기
#include <iostream>
int main()
{
char ch[20];
std::cout << "문자열 입력 : ";
std::cin >> ch;
}
#include <iostream>
// 문자열 길이
int my_strlen(char *ch) {
int len = 0;
for(int i = 0; ch[i] != 0; i++) {
len += 1;
}
return len;
}
int main()
{
char ch[20];
std::cout << "문자열 입력 : ";
std::cin >> ch;
int len = my_strlen(ch);
std::cout << "문자열 길이 : " << len;
}
[입력]
hello
[출력]
문자열 입력 : abcdef
문자열 길이 : 6
ch
에는 아래와 같이 문자 배열이 저장되어 있다.
my_strlen()는 ch[i] = NULL-1인 ch[5] 까지만 반복한다.
총 6번의 반복을 거치므로 len
에는 6
이 저장된다.
#include <iostream>
// 문자열 길이
int my_strlen(char *ch) {
int len = 0;
for(int i = 0; ch[i] != 0; i++) {
len += 1;
}
return len;
}
// 문자열 복사
// 입력 받은 char 배열을 for문을 통해 하나씩 가져와서
// chcpy에 저장
char my_strcpy(char *ch, char *chcpy) {
for(int i = 0; ch[i] != 0; i++) {
chcpy[i] += ch[i]; // chcpy에는 NULL-1 까지만 저장
}
return 0;
}
int main()
{
char ch[20];
char chcpy[20];
std::cout << "문자열 입력 : ";
std::cin >> ch;
int len = my_strlen(ch);
std::cout << "문자열 길이 : " << len << '\n' << '\n';
my_strcpy(ch,chcpy);
std::cout << "char 복사 : " << chcpy;
}
[출력]
문자열 입력 : abcdef
문자열 길이 : 6
char 복사 : abcdef
#include <iostream>
#define ARRAY_LENGTH 20 // 매크로 값 20으로 선언
// 문자열 길이
int my_strlen(char *ch) {
int len = 0;
for(int i = 0; ch[i] != 0; i++) {
len += 1; // ch[NULL-1] 까지이므로 len에는 6이 저장
}
return len;
}
// 문자열 복사
// 입력 받은 char 배열을 for문을 통해 하나씩 가져와서
// chcpy에 저장
char my_strcpy(char *ch, char *chcpy) {
for(int i = 0; ch[i] != 0; i++) {
chcpy[i] += ch[i]; // chcpy에는 NULL-1 까지만 저장
}
return 0;
}
// 문자열 반전
char my_strrev(char *ch) {
int len = my_strlen(ch); // len = 6 (ch[len] = NULL)
len -= 1; // len = 5 (ch[len] = NULL-1)
char ch_temp[ARRAY_LENGTH]; // 임시 버퍼 배열 초기화
// swap
for(int i = 0; i < len; len--, i++) {
*ch_temp = ch[i];
ch[i] = ch[len];
ch[len] = *ch_temp;
}
return 0;
}
int main()
{
char ch[ARRAY_LENGTH];
char chcpy[ARRAY_LENGTH];
std::cout << "문자열 입력 : ";
std::cin >> ch;
int len = my_strlen(ch);
std::cout << "문자열 길이 : " << len << '\n' << '\n';
my_strcpy(ch,chcpy);
std::cout << "char 복사 : " << chcpy << '\n';
my_strrev(ch);
std::cout << "char 반전 : " << ch << '\n';
}
[출력]
문자열 입력 : abcdef
문자열 길이 : 6
char 복사 : abcdef
char 반전 : fedcba
여기부터는 string.h 헤더파일 추가해 메소드 사용
char *ch_reverse = strrev(ch);
std::string str(ch_reverse);
std::cout << "string 복사 : " << ch_reverse << '\n';
int len = str.length();
char trans_str(char *ch) {
// 1. 'ch'이 my_strrev() 함수를 거치면서 반전된 상태이므로 다시 반전
char *ch_reverse = strrev(ch);
// 2. char 배열 -> string으로 변환
std::string str(ch_reverse);
std::cout << "string 복사 : " << ch_reverse << '\n';
// 3. string 반전
int len = str.length();
// 방법 #1
for(int i = 0; i < len/2; i++) {
int str_temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = str_temp;
}
// 방법 #2
// len -= 1;
//
// for(int i = 0; i < len; len--, i++) {
// int str_temp = str[i];
// str[i] = str[len];
// str[len] = str_temp;
// }
std::cout << "string 반전 : " << str << '\n';
}
[출력]
문자열 입력 : abcdef
문자열 길이 : 6
char 복사 : abcdef
char 반전 : fedcba
string 복사 : abcdef
string 반전 : fedcba
str[len-1-i]
NULL을 빼기 위해서 -1
을 해준다.int main()
{
char ch[ARRAY_LENGTH];
char chcpy[ARRAY_LENGTH];
std::cout << "문자열 입력 : ";
std::cin >> ch;
int len = my_strlen(ch);
std::cout << "문자열 길이 : " << len << '\n' << '\n';
// 입력 받은 문자열 예외처리
// 20을 넘기지 않으면, 정상출력
// 넘길 시, 범위를 벗어났음을 알림
if(len < 20) {
my_strcpy(ch,chcpy);
std::cout << "char 복사 : " << chcpy << '\n';
my_strrev(ch);
std::cout << "char 반전 : " << ch << '\n' <<'\n';
trans_str(ch);
}
else {
std::cout << "범위를 벗어났습니다.";
}
}
[출력] 범위를 벗어나지 않았을 경우
문자열 입력 : abcdef
문자열 길이 : 6
char 복사 : abcdef
char 반전 : fedcba
string 복사 : abcdef
string 반전 : fedcba
[출력] 범위를 벗어났을 경우
문자열 입력 : ajskldjflkjfal;sjfdlk;
문자열 길이 : 22
범위를 벗어났습니다.
#include <iostream>
#include <string.h>
#define ARRAY_LENGTH 20
// 문자열 길이
int my_strlen(char *ch) {
int len = 0;
for(int i = 0; ch[i] != 0; i++) {
len += 1; // ch[NULL-1] 까지이므로 len에는 6이 저장
}
return len;
}
// 문자열 복사
// 입력 받은 char 배열을 for문을 통해 하나씩 가져와서
// chcpy에 저장
char my_strcpy(char *ch, char *chcpy) {
for(int i = 0; ch[i] != 0; i++) {
chcpy[i] += ch[i]; // chcpy에는 NULL-1 까지만 저장
}
return 0;
}
// 문자열 반전
char my_strrev(char *ch) {
int len = my_strlen(ch); // len = 6
len -= 1; // len = 5
char ch_temp[ARRAY_LENGTH]; // 임시 버퍼 배열 초기화
// swap
for(int i = 0; i < len; len--, i++) {
*ch_temp = ch[i];
ch[i] = ch[len];
ch[len] = *ch_temp;
}
return 0;
}
// string
char trans_str(char *ch) {
// 1. 'ch'이 my_strrev() 함수를 거치면서 반전된 상태이므로 다시 반전
char *ch_reverse = strrev(ch);
// 2. char 배열 -> string으로 변환
std::string str(ch_reverse);
std::cout << "string 복사 : " << ch_reverse << '\n';
// 3. string 반전
int len = str.length();
// 방법 #1
for(int i = 0; i < len/2; i++) {
int str_temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = str_temp;
}
// 방법 #2
// len -= 1;
//
// for(int i = 0; i < len; len--, i++) {
// int str_temp = str[i];
// str[i] = str[len];
// str[len] = str_temp;
// }
std::cout << "string 반전 : " << str << '\n';
}
int main()
{
char ch[ARRAY_LENGTH];
char chcpy[ARRAY_LENGTH];
std::cout << "문자열 입력 : ";
std::cin >> ch;
int len = my_strlen(ch);
std::cout << "문자열 길이 : " << len << '\n' << '\n';
// 입력 받은 문자열 예외처리
// 20을 넘기지 않으면, 정상출력
// 넘길 시, 범위를 벗어났음을 알림
if(len < 20) {
my_strcpy(ch,chcpy);
std::cout << "char 복사 : " << chcpy << '\n';
my_strrev(ch);
std::cout << "char 반전 : " << ch << '\n' <<'\n';
trans_str(ch);
}
else {
std::cout << "범위를 벗어났습니다.";
}
}