문자열

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

문자열

 

   const int BUF_SIZE = 100;

    // [H][e][l][l][o]['\0][][][][][][][][][][[]...  // 100개의 바구니
    char a[BUF_SIZE] = "Hello";

    int BUF_len = sizeof(a);
    cout << BUF_len << endl;

    int len = strlen(a);
    cout << len;

 

실행화면

 


 

 

strlen

 

strlen은 'string length' 매개변수로 전달한 '문자열 길이를 구하는 함수'이다. 

문자열의 끝에 생략된 'NULL 문자'인 '\0'은 포함되지 않는다. 

예를들어, 'text'라는 문자열의 길이를 구하면 4이다. 또한 제어문자인 '\n', '\t', '\r'와 같은 문자열은 1개의 문자로 처리된다.

 

https://m.blog.naver.com/tipsware/220982995703

 


 

 

문제1.  문자열 길이를 출력하는 함수  -  StrLen

 

#include <iostream>
using namespace std;

int StrLen(const char* str)
{
    // str이라는 문자열의 길이를 반환
    int i = 0;

    while (str[i] != '\0')
        i++;

    return i;
}

int main()
{
    const int BUF_SIZE = 100;

    // [H][e][l][l][o]['\0][][][][][][][][][][[]...  // 100개의 바구니
    char a[BUF_SIZE] = "Hello";

    int len = StrLen(a);
    cout << len;

    return 0;
}

 

실행화면

 


 

 

 

 

문제2.  문자열 복사 함수  -  StrCpy

 

[H][e][l][l][o]['\0'][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]...  
[H][e][l][l][o]['\0'][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]...  

#include <iostream>
using namespace std;

// src[ 주소1 ] src[ 주소2 ]  
char* StrCpy(char* dest, char* src)
{
    // 방법 #1
    int j = 0;

    while (src[j] != '\0')  // src[j] != 0 와 동일  // src[j] 로 생략해서 표기해도 괜찮음
    {
        dest[j] = src[j];
        j++;
    }

    dest[j] = '\0';

    return dest; 
    

    // 방법 #2 // 방법 #1, 방법 #2 중 하나 주석처리 해야함.
    char* ret = dest;

    while (*src != '\0')
    {
        *dest = *src;
        dest++; //char는 1byte이므로 다음문자 칸으로 이동하려면 +1만 하면 된다.
        src++;         
        // 위의 세줄의 코드를 *dest++ = *src++으로 표현할수도 있다.
    }

    *dest = '\0';

    return ret;
}

#pragma warning(disable: 4996)
int main()
{
    const int BUF_SIZE = 100;

    // [H][e][l][l][o]['\0][][][][][][][][][][[]...  // 100개의 바구니
    char a[BUF_SIZE] = "Hello";
    char b[BUF_SIZE];

    StrCpy(b, a);

    return 0;
}

 


 

 

 

 

문제3.  문자열을 덧붙이는 함수  -  StrCat

 

방법1

// src[ 주소1 ] src[ 주소2 ]  
char* StrCat(char* dest, char* src)
{    
	int len = StrLen(dest);
    
    int i = 0;
	while (src[i] != '\0')
    {
        dest[len + i] = src[i];
        i++;
    }
	
    dest[len + i] = '\0';

    return dest;
}

 

방법2.

char* StrCat(char* dest, char* src)
{    
	char* ret = dest; //시작위치 저장

	while (*dest != '\0')
    	dest++;
        
    while (*src) // *src != '\0'에서 != '\0'은 생략 가능하다.
    	*dest++ = *src++;
    
    *dest = '\0';
    
    return ret;
}

 

 

#pragma warning(disable: 4996)
int main()
{
    const int BUF_SIZE = 100;

    // [H][e][l][l][o]['\0][][][][][][][][][][[]...  // 100개의 바구니
    char a[BUF_SIZE] = "Hello";
    char b[BUF_SIZE] = "World";

    StrCat(a, b);

    return 0;
}

실행하면 StrCat에 "HelloWorld"가 들어간다.

 


 

 

 

 

문제4.  문자열을 비교하는 함수  -  StrCmp

 

#pragma warning(disable: 4996)
int main()
{
    const int BUF_SIZE = 100;

    // [H][e][l][l][o]['\0][][][][][][][][][][[]...  // 100개의 바구니
    char a[BUF_SIZE] = "Hello";
    char b[BUF_SIZE] = "Hello";

    if (a == b)
    {
    	cout << "같다" << endl;
    }
	else
    {
    	cout << "다르다" << endl;
    }
    
    return 0;
}

 

실행화면

 

내용물이 같을뿐, ab주소다르다. a와 b는 각각 다른 위치를 가리키고 있다.

 

 

 

StrCmp( a, b )

return value  
< 0   a의 문자열 첫 글자가 b의 문자열 첫 글자 보다 작은값인 경우 
0   a와 b의 문자열이 같은 경우  
> 0   a의 문자열 첫 글자가 b의 문자열 첫 글자 보다 큰값인 경우 

 

 

int StrCmp(char* dest, char* src)
{    
	int i = 0;
    
    while ( a[i] != '\0' || b[i] != '\0')
    {
    	if (a[i] > b[i])
        	return 1;
        if (a[i] < b[i])   
        	return -1;
        i++
    }
    
    return 0;
}

#pragma warning(disable: 4996)
int main()
{
    const int BUF_SIZE = 100;

    char a[BUF_SIZE] = "Hello";
    char b[BUF_SIZE] = "Hella";
    
    int value = StrCmp(a, b);
    cout << value << endl;
    
    return0;
}

 

실행화면


 

 

 

문제5.  문자열을 뒤집는 함수  -  ReverseStr

 

void ReverseStr(char* str)
{    
	jint len = StrLen(str);
    
    for (int i = 0; i < len / 2; i++)
    {
    	int temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}

#pragma warning(disable: 4996)
int main()
{
    const int BUF_SIZE = 100;

    char a[BUF_SIZE] = "Hello";
    
    ReverseStr(a);
    cout << a << endl;
    
    return0;
}

 

실행화면

 


 

 

 

 

 

 

 

 

 

 

#pragma warning(disable: 4996) 붙이는 이유

버퍼 오버플로우