프로그래밍 언어/C++
[C] 공백 포함 문자열 입력 받기 (scanf, gets, fgets)
#include #define LEN 1000000 int main(){ char str[LEN]; scanf("%s",str); printf("%s",str); } 1. scanf[] scanset character scanset character [] 를 scanf 함수에 추가해 주는 방법이다. [^"문자"]의 의미는 해당 문자가 나오기 전 까지 모든 문자열을 받겠다는 뜻이다. 개행(엔터)를 의미하는 문자인 "\n" 를 ^뒤에 넣어주면, 개행(엔터)가 나오기 전 까지 모든 문자열을 받겠다는 뜻이 된다. 따라서, 공백도 포함해서 입력을 받을 수 있게 되는 것이다. /* scanset character 예시 */ #include #define LEN 1000000 int main(void){ char s..
[C] 지역 변수 2차원 배열 동적 할당 및 해제 코드
#define _CRT_SECURE_NO_WARNINGS #include #include #include void main() { int n; scanf("%d", &n); // 동적할당 int** arr = (int**)malloc(sizeof(int*) * n); memset(arr, 0, sizeof(int*) * n); if (arr == NULL) return; for (int y = 0; y < n; y++) { arr[y] = (int*)malloc(sizeof(int) * n); memset(arr[y], 0, sizeof(int) * n); } for (int y = 0; y < n; y++) { for (int x = 0; x < n; x++) arr[y][x] += 1 + y + x;..
[C] main 함수에게 return 이란?
return 은 c언어의 예약어이다. 리턴값은 없거나 있다면 정수형이어야 한다. C++ 표준 문서(43p)에는 정확하게 It shall have a return type of type int, but otherwise its type is implementation defined 이렇게 되어 있다. main 함수의 리턴값은 int형의 타입을 가지는 것이 좋지만 구현 방식에 따라 다른 타입을 가지는 것도 가능하다. 즉 C++ 스팩은 int를 강력히 권장하기는 하지만 강요하지는 않는다. 비주얼 C++은 int, void 모두 가능한데 과거부터 이렇게 써 왔기 때문에 호환성을 더 중요시한다는 입장이다. gcc는 표준의 권고대로 main 함수의 리턴 타입으로 int만 인정한다. main 함수가 리턴하는 값을 탈..
[C] 문자열(String) - 문자열 저장, 널문자, 문자열 배열, 문자열 크기
문자열(String) 문자의 집합 문자열이라고 하는 데이터 형식은 따로 존재하지 않는다. 문자열은 한문자(char)가 여러 개 이어져 있는 형태다. 문자열 저장 문자열 저장을 위해서는 문자열 길이에 1을 더한 만큼의 크기가 필요하다 왜냐하면 문자열의 끝을 표시하는 널문자(NULL, \0)가 존재하기 때문이다. 널문자 문자열의 끝을 알려주는 역할 \0, 하나의 문자로 취급, 화면에 출력 되지 않음 문자열 배열 문자열 저장 변수. 문자를 연속적으로 나열한 배열형태가 되어야 한다. 문자열의 크기) 실제 문자열 + 1 (NULL 문자) https://codedragon.tistory.com/5274
[C] 정적변수, 지역변수, 전역변수 비교 (static, local, global)
☑️ 지역변수(local variable, 자동변수)는 중괄호 내부, 함수의 매개변수(Parameter)에서 사용되는 변수를 의미한다. 지역변수의 지역은 함수의 내부, 중괄호 내부를 의미한다. 따라서 함수 안에서만 접근 가능하며, 함수를 벗어나면 사라진다 (= 변수의 메모리 공간이 소멸된다). 지역변수는 초기화하지 않으면 컴파일 에러가 나거나 쓰레기값이 저장된다. 지역변수(local variable)는 자동변수(auto variable)와 같다. 자동변수는 흔히 블록(중괄호) 안에서 사용하는 변수로서, 변수가 생성된 뒤에 자동으로 사라진다고 하여 자동변수라고 부른다. 매우 흔히 사용하기 때문에 auto 키워드를 생략하고 사용한다. ☑️ 전역 변수(global variable)는 지역변수와 반대로 중괄호 ..
[C++] 테스트용 map<int, 포인터배열>
#include #include using namespace std; class Test { private: Test** arr = new Test * [10]; map m; public: int val = 0; Test() { cout
C++ 참조자(Reference)의 이해
참조자(레퍼런스)란 C에서는 없던, C++에서 새로 생긴 개념. 포인터랑 의도하는 바는 같은데 포인터의 단점이 보완되어 출시된 것. C++ 문서에서는 포인터보다 특정 경우가 아니라면 대부분 참조자를 사용하길 권장한다. 값으로 전달하는 방식의 한계 1. 큰 구조체나 클래스를 함수에 전달할 때 인수의 복사본을 매개변수로 만든다. 2. 함수의 호출자에 값을 전달하는 건 반환값을 사용하는 게 유일한 방법이나 함수에서 인수를 수정하는 게 확실하고 효율적이다. → 그래서 참조를 통해 문제를 해결한다. 변수를 참조로 전달하려면 매개변수를 참조로 선언한다. 함수가 호출되면 y는 인수에 대한 참조가 된다. int x=5; addOne(x); //int &y=x; 이런 의미 void addOne(int& y) { y=y+..
C Call-by-Value(값에 의한 호출) & Call-by-Reference(참조에 의한 호출)의 이해
C++ 언어에서는 레퍼런스 혹은 참조자(&)라는 개념이 따로 있으므로, 이를 Call-by-Address(주소에 의한 호출)라고 하지만 C 언어라는 것에 한정을 두고 Call-by-Reference(참조에 의한 호출)의 명칭으로 설명한다. 포인터와 메모리에 대한 개념을 명확하게 알고 있다면 이에 대한 이해가 어렵지 않으나, 사실상 메모리에서 어떻게 주소와 값이 흘러가는지 제대로 파악을 할 수 없다면, Call-by-Value와 Call-by-Reference에 대하여 많은 어려움을 겪을 것이다. 1. Call-by-Value (값에 의한 호출) Call-by-Value는 함수에 인자를 변수에 대입된 값을 던져주는 것을 의미한다. 일단 아래의 코드를 보자. 다음과 같이 int a 변수에는 10을 대입하고,..
[C++] 문자열 인코딩 (유니코드 멀티바이트 UTF-8 변환)
유니코드 > 멀티바이트 wchar_t strUnicode[256] = {0,}; charstrMultibyte[256] = {0,}; wcscpy_s(strUnicode,256,L"유니코드"); int len = WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, NULL, 0, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, strMultibyte, len, NULL, NULL ); stl 이용 wstring strUni = L"유니코드"; int len = WideCharToMultiByte( CP_ACP, 0, &strUni[0], -1, NULL, 0, NULL, NULL ); string strMul..
[C++] *와 *& 연산자의 차이
int *&x int *y 의 차이 x는 int 포인터에 대한 레퍼런스 타입 y는 int 포인터 타입 아래 func 함수 파라미터로 넘길 시 y는 복사본을 받을거고 x는 포인터에 대한 주소를 받게 된다. 이거는 y는 스코프 벗어 날 시 값 변화가 없지만 x는 변경된다 void func(int* p, int*& pr) { p++; pr++; } int main() { int a[2]; int* b = &a[0]; int* c = &a[0]; std::cout