Languages & Frameworks/C C++
[C/C++] strncpy()는 NULL문자를 넣어주지 않는다.
[C/C++] strncpy()는 NULL문자를 넣어주지 않는다.
2018.08.21```cint main() { int size = 4; char buf[size] = {'*', '*', '*', '*'}; strncpy(buf, "asd", size - 1); // buf[size - 1] = '\0'; printf("%s\n", buf); return 0;}``````asd*�FUUUU```따라서 명시적으로 ``c '\0'``을 넣어주어야 한다.쓰려는 src문자열의 길이가, 명시된 `` n``보다 작은 경우는 NULL문자를 넣어주지만, src문자열의 길이가 `` n``과 같거나 큰 경우 `` n``까지만 쓰고 그냥 그만두기 때문에, 명시적으로 넣어주는 것이 좋다.
[C++] \r이 포함된 문자열 출력할 때 이상하게 출력되는 현상
[C++] \r이 포함된 문자열 출력할 때 이상하게 출력되는 현상
2018.08.21```cpp#include #include using namespace std; int main() { string item = "abc\r\ndef\nghi"; // contain \r istringstream stream(item); while (getline(stream, item)) { cout
[C++] 맵 : unordered_map (hash_map)
[C++] 맵 : unordered_map (hash_map)
2018.08.20find와 count로 exist 체크내부에 해당 key가 존재하는지는 ``c count()/find()``를 사용한다.중복을 허용하지 않는 자료구조에서 둘은 내부적으로 거의 똑같기 때문에, 취향 대로 사용하면 된다.```cpp#include #include std::unordered_map hash_map;int main() { hash_map.insert(std::make_pair("umbum", 1234)); // hash_map["umbum"] = 1234 도 가능. if (hash_map.count("umbum")) { std::cout
[C++] directory listing (traversal)
[C++] directory listing (traversal)
2018.08.10원래는 boost에 있는 API이고, C++ 17에서 표준으로 추가되었기 때문에, boost를 추가하거나 컴파일러를 C++17로 변경해야 한다.후자가 더 편하기 때문에, 프로젝트 설정 - C/C++ - Language - C++ Language Standard를 `` /std:c++17``로 변경해준다. ```cpp#include #include namespace fs = std::filesystem;using namespace std; int main(int argc, char **argv){ for (auto& p : fs::recursive_directory_iterator(root_path)) { /* .path() 메서드가 다시 path 객체를 리턴하기 때문에 C style의 입출력을 사용하지 ..
[C/C++] clock : 수행 시간 측정 / logging : 에러 출력
[C/C++] clock : 수행 시간 측정 / logging : 에러 출력
2018.08.09clock과 chrono의 초단위 정밀도 차이```c[clock ] 0.001513[chrono] 0.00151351``` [C] clock```c#include int main(int argc, char *argv[]) {clock_t begin, end;begin = clock();// processing end = clock();printf("[*] processing time : %lf\n", (double)(end - begin) / CLOCKS_PER_SEC);return 0;}``` [C++] chrono```cpp#include #include #include #include int main() { auto start = std::chrono::system_clock::now(); // p..
[C++] File IO : <ifstream> 과 pubsetbuf()
[C++] File IO : <ifstream> 과 pubsetbuf()
2018.08.03``c ifstream``을 사용할지, ``c fopen()``을 사용할지는 얻어낸 결과를 어디에 담을 것인지에 따라 결정하면 된다. 어차피 얻어낸 데이터를 가공하는 과정에서 `` string``으로 만들어야 한다거나, `` string``의 메서드를 사용해야 편한 경우라면 그냥 `` ifstream``을 사용한다. 왜냐면, ``c char*``에서 `` string``으로 변환하는건 새로운 `` string``을 만들면서 생성자로 ``c char*``데이터를 집어넣는 수 밖에 없는데 이 때 Deep copy가 발생한다.Shallow copy하는 방법 없나 찾아봤는데 아마 없는 것 같다.그래서 문자열 데이터가 큰 경우 copy시 발생하는 오버헤드를 줄일 필요가 있기 때문에 아예 가공할 데이터의 타입을 따..
[C/C++]의 동적 할당과 Memory leak
[C/C++]의 동적 할당과 Memory leak
2018.06.11이게 아주 중요한 이슈인데, memory leak은 구조체, 포인터의 배열 등 동적 할당 받은 공간이 또 다른 동적 할당 받은 더 큰 공간의 entry가 될 때 자주 발생한다. 다음과 같이 단순한 경우는 그냥 해제 해주면 그만이다.```cvoid normal() { void *foo = malloc(4); free(foo);}``` 근데 문제는 다음과 같은 상황이다.```ctypedef struct _ {int *record[3];} Bucket; Bucket *bucket; void insertEntry() {int *foo = (int*)malloc(sizeof(int));*foo = 1;bucket->record[0] = foo;} void leak() {bucket = (Bucket*)malloc..
[C] system V IPC
[C] system V IPC
2017.11.10이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[C] dll을 이용한 메모리(데이터) 공유
[C] dll을 이용한 메모리(데이터) 공유
2017.11.10전통적인 IPC method를 사용하지 않고 프로세스 간 데이터를 공유할 수 있는 방법. data_seg pragma dll injection 되어있을 때, injection 된 dll에 ``c #pragma data_seg()``가 있으면 해당 memory(data)에 접근해 exe나 타 dll이 가져다 쓸 수 있다. ```c #pragma comment(linker, "/SECTION:.SHARE, RWS") ``` section의 attribute를 바꾸는 코드인데(RWS) 굳이 안해도 된다. ```c #pragma data_seg(".SHARE") //section은 .SHARE든 뭐든 아무거나 지정하면 된다. 변수 선언 및 초기화 . . . #pragma data_seg() ```
[C] dup2 + pipe
[C] dup2 + pipe
2017.10.12이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[C] File IO : open, fopen, setbuf / fd VS fp
[C] File IO : open, fopen, setbuf / fd VS fp
2017.10.12이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[C] File IO : mmap - memcpy family
[C] File IO : mmap - memcpy family
2017.10.09이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.