모두의 코드
모두의 코드

총 42 개의 강의로 준비된 씹어먹는 C 언어 강좌를 통해 C 언어의 처음부터 끝까지 배우실 수 있습니다! 특히 악명 높은 C 언어의 포인터나, 어려운 개념들을 충실히 짚고 넘어갑니다.

이 강좌는 2010년에 완결되었지만, 지속적으로 개선 및 보완하고 있습니다.

C 언어 문법을 아시는 분들이라면, 씹어먹는 C++ 강좌를 통해 C++ 기초 부터 최근의 C++ 17 까지 모든 내용을 배우실 수 있습니다. C 언어와 C++ 의 기본적인 문법이 비슷하기 때문에, C 언어를 어느 정도 아는 독자를 가정하여 쓰여져 있습니다.

현재 강좌는 연재 진행 중이며, 총 44 개의 강좌가 준비되어 있습니다.

사이트 내에서 검색 하기
C 언어 레퍼런스
표준 입출력 라이브러리 stdio.h
문자열 관련 라이브러리 string.h
시간 관련 라이브러리 time.h
C ++ 레퍼런스
문자열 라이브러리 string
알고리즘 라이브러리 algorithm
최근 댓글
void String::Add_String(const String& Str) { if (m_Str != nullptr) { size_t temp_length = strlen(m_Str) + 1; char* temp = new char[temp_length]; memmove(temp, m_Str, temp_length); delete[] m_Str; m_Str = nullptr; if (Str.m_Str != nullptr) { size_t length = strlen(Str.m_Str) + 1; m_Str = new char[temp_length + length - 1]; memmove(m_Str, temp, temp_length - 1); memmove(m_Str + temp_length-1, Str.m_Str, length); m_Len = temp_length + length - 2; } else { m_Str = nullptr; m_Len = 0; } } } 이 부분에서 memmove(m_Str, temp, temp_length - 1); memmove(m_Str + temp_length - 1, Str.m_Str, length); 위 코드는 아래의 코드에서 런타임 에러가 발생하기에 고쳐 본 코드입니다. 아래의 코드에서 런타임 에러가 발생합니다. memmove(m_Str, temp, temp_length - 1); memmove(m_Str + temp_length , Str.m_Str, length); 직접 디버거를 찍어보고 위의 코드와 아래의 코드에서 +1의 차이로 에러가 발생 하는 것을 확인 하였지만 제가 직접 메모리를 그림으로 그려보면서 이해 하려고 노력했지만 왜 -1을 해야 하는지... 이해가 안되네요 수학을 많이 못해서 그런지 이런 부분에서 항상 막히게 되는 것 같네요ㅠ 런타임 에러가 발생 헀을때 직접 메모리에 들어있는 값을 디버거로 확인하는 방법과 디버거를 효율적으로 이용하려면 어떻게 해야하는지,그리고 visual studio 2019 커뮤니티 버전을 사용 중인데,보통 변수의 값이나 메모리를 찍어보기 위해서 디버거를 사용하라고 하시던데, autos 라는 창에서 value 값을 확인하는 방법 외에 좀더 편리하게 볼 수 있는 방법이 있나요? 실제 개발자들은 어떻게 하는지 궁금합니다!
이재덕 02.21
#include <iostream> #include <cstring> class String { char* m_Str; int m_Len; public: String() { m_Str = new char[1]{ 0 }; m_Len = 0; } String(char c, int n); String(const char* a_Str); String(const String& Str); ~String(); void Add_String(const String& Str); void Copy_String(const String& Str); int Strlen(); void OutString(); }; void String::OutString() { std::cout << m_Str<<" Length : "; } String::String(char c, int n) { m_Str = new char[n + 1]; memset(m_Str, 'c', n ); m_Str[n] = '\0'; m_Len = n; for (int i = 0; i < 6; i++) { printf("%c ", *(m_Str + i)); } } String::String(const char* a_Str) { if (a_Str != nullptr) { //delete[] m_Str; size_t length = strlen(a_Str) + 1; m_Str = new char[length]; memmove(m_Str, a_Str, length); m_Len = length - 1; } else { m_Str = nullptr; m_Len = 0; } } String::String(const String& Str) { if (Str.m_Str != nullptr) { size_t length = strlen(Str.m_Str) + 1; m_Str = new char[length]; memmove(m_Str, Str.m_Str, length); m_Len = length - 1; } else { m_Str = nullptr; m_Len = 0; } } String::~String() { std::cout << "***Destroyer***" << std::endl; delete[] m_Str; } int String::Strlen() { return m_Len; } void String::Add_String(const String& Str) { if (m_Str != nullptr) { size_t temp_length = strlen(m_Str) + 1; char* temp = new char[temp_length]; memmove(temp, m_Str, temp_length); delete[] m_Str; m_Str = nullptr; if (Str.m_Str != nullptr) { size_t length = strlen(Str.m_Str) + 1; m_Str = new char[temp_length + length - 1]; memmove(m_Str, temp, temp_length - 1); memmove(m_Str + temp_length-1, Str.m_Str, length); m_Len = temp_length + length - 2; } else { m_Str = nullptr; m_Len = 0; } } } void String::Copy_String(const String& Str) { if (m_Str != nullptr) { if (Str.m_Str != nullptr) { delete[] m_Str; size_t length = strlen(Str.m_Str) + 1; m_Str = new char[length]; memmove(m_Str, Str.m_Str, length); m_Len = length - 1; } else { delete[] m_Str; m_Str = nullptr; m_Len = 0; } } } int main() { String str1('c', 5); String str2("kmpString"); String str3(str2); std::cout << "Str1 : "; str1.OutString(); std::cout << str1.Strlen() << std::endl; std::cout << "Str2 : "; str2.OutString(); std::cout << str2.Strlen() << std::endl; std::cout << "Str3 : "; str3.OutString(); std::cout << str3.Strlen() << std::endl; str1.Add_String(str2); std::cout << "Add String After -> Str1 : "; str1.OutString(); std::cout << str1.Strlen() << std::endl; str2.Add_String(str3); std::cout << "Add String After -> str2 : "; str2.OutString(); std::cout << str2.Strlen() << std::endl; str3.Copy_String(str1); std::cout << "Copy_String -> Str3 : "; str3.OutString(); std::cout << str3.Strlen() << std::endl; }
이재덕 02.21