블로그 이미지

접근 지정자 const

2014. 4. 28. 13:41

접근 지정자 const는 정리하면 다음과 같습니다.


1. const는 자신의 오른쪽 것에 적용된다.

2. 오른쪽에 적용대상이 없으면 왼쪽에 적요안다. 여기서 말하는 적용대상이란 * 또는 형 (type)이다.


const char* str;

const char* str; 이라고 선언하면 str=str+1; 등 str은 변경할 수 있으나 *str은 변경할 수 없음. 즉, const 포인터가 아니라 const char 임.


char* const str;

char* const str="abcd"; 하믄 위와 반대로 됨.

const char* const str = "abcd"; 하면 str, *str 둘 모두 const가 되어 변경할 수 없음.

이들을 쉽게 구분하려면 아래와 같이 합니다.


함수의 반환형과 배개변수에서도 위의 내용이 동일하게 적용됩니다.


예)

가끔 const char* 을 const 포인터이자 char인 것으로 오해하는 경우가 있습니다. const포인터가 아닙니다.

int StrLen(const char* str)

{

const char* p = str;

while(*p) p++;    //이 곳의 p++을 못하는 것으로 오해하지 말아야.

return (p-str);

}





블로그 이미지

[Linux] 파일 찾기 명령어 find

2014. 4. 14. 17:32

출처: http://inlab.egloos.com/990321


find 명령어를 이용하면 간단하게 파일을 찾을 수 있다.

명령어의 기본적인 사용법에 대해서 설명하면

find [경로] [옵션] [파일명]

이런 식으로 이루어진다고 생각하면 된다.

예를 들면

find / -name '*.apk'

와 같은 식으로 입력을 한다면,
ㅋ`
최상위 디렉토리, (root)에서 부터 검색을 해서 확장자가 apk로 끝나는 모든 파일을 찾는다는 의미이다.

find / -name 'mysql*' 

와 같은 식으로 작성을 한다면 mysql 이라는 단어로 시작하는 모든 파일을 찾는다는 의미가 된다.

find / -name 'mysql'


이라고 하게 되면 이름이 'mysql'인 모든 파일을 찾게 될 것이다.

명령어를 조금 조작해본다면 알 수 있겠지만, 정확한 파일명을 안다면, 확장자까지 정확하게 입력해주어야 제대로 된 결과를 얻을 수 있다.

find -name '*.apk'

처럼 경로를 생략하고 명령어를 입력하면 해당 디렉토리에서부터 그 하위 디렉토리까지 검색을 하게 된다.

find -name '*.apk' -ls 


블로그 이미지

[C++] 표준 입력 함수 cin, cin.get(), cin.getline()

2013. 8. 21. 01:07

1. cin

=> <iostream> 에 존재

=> 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져옴

=> 공백, 개행 무시

=> 개행 키보드 버퍼에 남겨둠


=> space 단위로 끊어서 입력 받을 수 있다


cin은 문자와 문자열 모두 입력받을 수 있습니다.

예를들면요,

#include <iostream.h>

void main()

{

char a; //문자변수 선언

cin>>a; //문자입력 받음

cout<<a; //입력했던 문자 출력

}

 


또 다른 예는요,

#include <iostream.h>
void main()
{
char a,b;
cin>>a;

cin>>b;
cout<<a<<" "<<b;
}

이 예의 결과는요,

t입력 후 엔터

y입력 후 엔터

결과=> t y 출력

변수 a에는 t, 변수 b에는 y가 입력되기 때문입니다.



또 다른 예는요,

#include <iostream.h>

void main()

{

char a[10]; //char형 배열 선언

cin>>a; //문자열 입력 받음

cout<<a; //입력했던 문자열 출력

}

이 예의 결과는요,

this is 입력 후 엔터

결과=> this



1. cin.get()

=> <iostream> 에 존재

=> 표준 입력 버퍼에서 문자를 하나만 가져옴

=> 공백, 개행 포함

=> 문자만 입력 받음


=> space 단위로 끊어서 입력 받을 수 있다


get()은 문자만 입력받을 수 있습니다.

예를들면,

#include <iostream.h>

void main()

{

char a;

a=cin.get(); //a에 입력한 문자 저장

cout<<a;

}



#include <iostream.h>

void main()

{

char a,b;

a=cin.get();
b=cin.get();

c=cin.get();

cout<<a<<" "<<b << " " << c;

}

이 예의 결과는요,

t입력 후 엔터, k입력후 엔터

<결과>

t


k

 

 

즉 t +Enter(new line:개행) + k입니다.

이것이 cin과의 차이점입니다.

 

앞에서 cin은 엔터가 나오면 입력종료로 간주했지만, get은 엔터도 입력받을 문자로 간주합니다.

 

따라서 변수a에는 t가, 변수b에는 엔터가 c에는 k가 입력됩니다.

 

또는

cin.get(a);
cin.get(b);
cin.get(c);

로 하였을 경우 다음과 같이 입력 하면

Q R

a에는 Q가, b에는 빈칸이, c에는 R이 저장됩니다.


1. cin.getline(변수의 주소, 최대 입력가능 문자수, 종결 문자)

=> <iostream> 에 존재

=> 종결 문자를 NULL로 바꿈, 종결 문자 생략시 엔터로 간주


=> 최대 입력 가능 문자수보다 많은 문자를 입려간 경우 n-1개 만큼 받아들이고 n번째 문자는 NULL로 바꾼다.

=> 공백, 개행 입력 받음

=> 문자열만 입력받음


=> cin.getline() 과 getline()는 다른 함수이다.


#include <iostream.h>

void main()

{

char a[10];
cin.getline(a,10);
cout<<a;

}

이 예의 결과는요,

this is 입력 후 엔터

결과=>this is

이것은 위의 cin의 결과와 차이점 입니다. cin은 공백을 만나면 입력이 끝난 줄 알지만 getline은 공백(아스키코드 32)도 문자로서 받아들입니다.



또 다른 예는요,

#include <iostream.h>

void main()

{

char a[10];

cin.getline(a,10,'i');

cout<<a;

}

  1. 달승 2020.07.11 17:08 신고  address  modify / delete  reply

    감사합니다 참고하겠습니다~!


블로그 이미지

(Visual C++) (C++.NET) ( Managed C++) (C++/CLI) 의 차이점

2013. 6. 7. 17:14

(Visual C++) (Visual C++.NET) ( Managed C++) (C++/CLI) 의 차이점


4개 모두의 공통점은 모두다 C++ 언어를 사용한다는 것이다. 단, 차이점은


  • Visual C++ 이란?

C++ 이란 언어를 써서 프로그래밍 작업을 할 수 있게 해주는 도구의 이름.


  • Visual C++.NET 이란?

.NET Framework 위에서 동작하는 C++ 개발 툴을  말합니다. 별도로 C++.NET이란 언어는 없습니다.

Visual C++ 제품 중에서 2001년~2003년 버전의 이름이 Visual C++.NET 이라고 불렸습니다.



  • Visual Studio .NET 2003 까지

Managed C++ 이라는 명칭 사용 (굉장히 많은 언더바[_] 사용으로 문법이 난해함)

Managed C++ 과 Visual C++.NET 은 같은 의미이다.

  • Visual Studio 2005 이후

C++/CLI 으로 명칭 변경 (비교적 훨씬 깔끔해졌고, 직관적인 문법 사용)


블로그 이미지

[C++] C++의 형변환 const_cast, static_cast, reinterpret_cast, dynamic_cast

2013. 2. 20. 21:18


1) const_cast

: 어떤 타입에서 const 속성이나 volatile 속성을 제거할 때 사용한다.


ex)

const int ADC_Value = 100;

int i = const_cast<int> (ADC_Value);


2) static_cast

: C언어의 묵시적 형변한과 같다.


ex)

a) C스타일

int a = 5;

double b = (double)a;


b) C++스타일

double a = 10.0;

char b = static_cast<char> (a);


3) reinterpret_cast

: 일반적으로 허용하지 않는 위험한 형변환을(강제 형변환) 할 때 사용한다. 그 안의 데이터가 어떤 객체이던 그저 비트열로만 보고 원하는 형으로 강제로 변환한다는 것이다.


ex)

포인터를 정수로 변환하는 작업.

int a;

int * b;

a = reinterpret_cast<int>(&b);


4) dynamic_cast

: 유일하게 C스타일의 형변환으로 흉내낼 수 없는 형 변환 이다. dynamic_cast는 서로 상속 관계에 있는 클래스간의 형변환을 할 때 사용한다.

형 변환에 문제가 없는지 안전검사도 하는데 문제가 있을시에는 NULL값을 리턴하거나 예외를 띄운다. 가상함수가 없는 클래스는 사용할 수 없다.


ex)

truck* ptruck = new car;

truck* ptruck = dynamic_cast<truck*>(new car);






블로그 이미지

[정렬][C++] Template를 이용한 Swap 함수

2013. 1. 30. 23:04

[정렬][C++]

Swap Function(스왑 함수)

 template<typename T>
void swap(T& _input1, T& _input2)
{
	T Temp = _input1;
	_input1 = _input2;
	_input2 = Temp;
}


예제)

 int main(void)
{

int a=5, b=7; char c = 'c', d = 'd'; swap(a, b); swap(c, d); cout << "a = "<< a << ", b = "<< b << endl; cout << "c = "<< c << ", d = "<< d << endl; return 0; }




블로그 이미지

[정렬][C++] Template를 이용한 버블 정렬(Bubble Sort)

2013. 1. 30. 22:59

Bubble Sort(버블 정렬)

C++, Array Version (배열 버전)


Bubble Sort Function(버블 정렬 함수)

 template<typename T, size_t n>
void sort_bubble(T (&_input)[n], bool _option)
{
	int length = sizeof(_input) / sizeof(_input[0]);
	
	for(int i=0; i<length;i++)
	{
		for(int j=i; j<length-1; j++)
		{
			if(_option)	//오름차순
			{
				if(_input[j] > _input[j+1])
				{
					swap(_input[j], _input[j+1]);
				}
			}else{	//내림차순
				if(_input[j] < _input[j+1])
				{
					swap(_input[j], _input[j+1]);
				}
			}
		}
	}
}


예제)

#define Ascending true
#define Descending false

int main(void)
{
	char test[] = {'a', 'c', 'a', 'f', 'd'};

	sort_bubble(test, Ascending);

	for(int i=0; i<7; i++)
	{
		cout <<test[i]<<endl;
	}
}



블로그 이미지

[C++][자료구조] Template 를 이용한 Stack Source Code

2013. 1. 4. 13:21

열혈강의 C++  P.464


class, Template를 이용한 Stack

#include <iostream> using std::cout; using std::endl; template <typename T> class Stack{ private: int topIdx; // 마지막 입력된 위치의 인덱스 T * stackPtr; // 스택 포인터 public : Stack(int s=10); ~Stack(); void Push(const T& pushValue); T Pop(); }; template <typename T> Stack<T>::Stack(int len){ topIdx=-1 //스택 인덱스 초기화 stackPtr=new T[len]; //데이터 저장 위한 배열 선언 } template <typename T> Stack<T>::~Stack() { delete[] stackPtr; } template <typename T> void Stack<T>::Push(const T& pushValue) { stackPtr[++topIdx] = pushValue; } template <typename T> T Stack<T>::Pop() { return stackPtr[topIdx--]; } int main() { Stack<char> stack(10); stack.Push('A'); stack.Push('B'); stack.Push('C'); for(int i=0;i<3; i++) { cout<<stack.Pop()<<endl; } Stack<int> stack2(10); stack2.Push(10); stack2.Push(20); stack2.Push(30); for(int j=0; j<3; j++) { cout<<stack2.Pop()<<endl; } return 0

} 



블로그 이미지

[C++] Namespace 네임스페이스

2012. 8. 9. 17:04

1. Namespace

정의 : 특정영역(공간)에 이름을 붙여주기 위한 문법적 요소

원리 : 한 집에 철수라는 이름을 지니는 사람이 두 명 살고 있다면 이는 문제가 된다. 그러나 서로 살고 있는 집이 다르다면 문제될 것이 없다. 201호에 사는 철수와 202호에 사는 철수는 구분 지을 수 있기 때문이다. 다음과 같이 부르면 되기 때문이다. "202호에 사는 철수야!" 이것이 이름공간의 기본 원리이다.

예제)

 #include <iostream
namespace A_COM 
{ 
    void function(void) 
    { 
        printf("A.com에서 정의한 함수 \n"); 
    } 
} 

namespace B_COM 
{ 
    void function(void) 
    { 
        printf("B.com에서 정의한 함수 \n"); 
    } 
} 

int main(void) 
{ 
    A_COM::function();    //A회사에서 정의한 함수 호출 
    B_COM::function();    //B회사에서 정의한 함수 호출 
    return 0; 
}


2. scope resolution operator(범위 지정 연산자)   ::

A_COM::function();

"A_COM이라는 이름공간 안에 선언되어 있는 function 함수를 호출하라"


※전역 변수 호출 또한 가능하다

예제)?

int val = 100; 

int main(void) 
{ 
    int val=5; 
    val+=1;        //지역변수 val를 1 증가 
    ::val+=1;    //전역변수 val를 1 증가 
    printf("지역변수 val: %d \n", val); 
    printf("전역변수 val: %d \n", ::val); 
    return 0; 
}


3. using

using A_COM::function();

"앞으로 function이라는 이름을 참조하는 코드가 나오면 A_COM 이라는 이름 공간 안에 선언된 function이라는 이름을 참조하라는 뜻이다."

예제)

#include <iostream> 

namespace A_COM 
{ 
    void function(void) 
    { 
        std::count << "A.com에서 정의한 함수" << std::endl; 
    } 
} 

using A_COM::function; 

int main(void) 
{ 
    function(); 
    return 0; 
}



using namespace std;

"앞으로 등장 하는 어떤 함수든 std namespace를 참조하라."

"cout, cin 함수는 iostream의 std라는 네임스페이스 안에 정의 되어 있다."

예제)

#include <iostream> 

using namespace std;

int main(void) 
{ 
    int val1, val2; 
    int result = 0; 

    cout << "두개의 숫자 입력 :"; 
    cin >> val1 >> val2; 

    if(val1<val2)    //val2가 크다면. 
    { 
        for(int i=val1+1; i<val2; i++) 
            result+=i; 
    } 
    else            //val1이 크다면 
    { 
        for(int i=val2+1; i<val2; i++) 
            result+=i; 
    } 

    cout << "두 수 사이에 존재하는 정수의 합 :" << result << endl; 
    return 0; 
}