반응형

알파벳 대소문자, 숫자를 포함한 랜덤한 문자열을 생성하는 함수



출처는 StackOverflow

void gen_random(char *s, const int len)
{
	static const char alphanum[] =
		"0123456789"
		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		"abcdefghijklmnopqrstuvwxyz";

	for (int i = 0; i < len; ++i) {
		s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
	}

	s[len] = 0;
}

여기에 문자 중복이 안되게끔 하거나, 특수문자를 추가하는 방법도 고려해봐야겠다.


반응형

C#에서는 FILE 핸들러로 바로 확인이 가능한데 C++는 한줄에 쓰기 번거러워 따로 함수를 만들어서 사용한다.


유니코드가 아닌 프로젝트도 있어 분기처리 해준다.



bool isExistFile(CString _strFile)
{
#ifdef _UNICODE
	return(_waccess_s(_strFile, 0) != -1);
#else
	return (_access_s(_strFile, 0) != -1);
#endif
	
}


반응형
  • a : 배열 (Array)
  • b : BOOL 형 변수 (Boolean)
  • by : BYTE 형 변수 (Byte, = unsigned char)
  • c : 카운터 변수 (Counter, = int)
  • cb : 바이트의 개수
  • ch : char형 변수 (Character, = char)
  • cx : X 좌표용 변수 (Coordinate X Value, = int)
  • cy : Y 좌표용 변수 (Coordinate Y Value, = int)
  • d : 날짜형 변수 (CDate)
  • dbl : double형 변수 (Double, = double)
  • dw : Unsined Long (DWORD)
  • f : BOOL 형 변수 (Flag)
  • h : 핸들형 변수 (Handle, = HANDLE)
  • n : 자연수형 변수 (Natural Number, = int)
  • i : 정수형 변수 (Integer, = int)
  • i : 인덱스 (Index)
  • l : long형 변수 (Long, = long)
  • m_ : 특정 클래스의 멤버 변수 (Member Variable)
  • p : 포인터 변수 (Pointer, = [type]*)
  • lp : long/far 포인터 변수 (Long/Far Pointer)
  • 32비트 프로그래밍에서는 일반 수준의 포인터로 취급함
  • 16비트 프로그래밍에서는 먼 거리의 포인터로 취급함
  • s : 문자열 (String)
  • sz : NULL (= \0)로 끝나는 문자열 (String)
  • u : 자연수 중 양수형 변수 (Unsigned Integer, = unsigned int)
  • w : WORD형 변수 (Word, = unsigned short)
  • dw : DWORD형 변수 (Double Word, = unsigned long)
  • str : CString형 변수 (String)
출처 : http://unidri.tistory.com/38


반응형

아래와 같은 오류가 발생할때에는 프로젝트 환경이 유니코드환경일 경우이다.


'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t * ,...)' :

매개 변수 1을 'const char [6]'에서 'const wchar_t *'으로 변활할수 없습니다 


CString Format 멤버함수를 사용하기 위해서는

아래와 같이 수정하여 사용한다.


수정 전 :



CString strtest;
strtest.Format("%d",nIndex);


수정 후 :


CString strtest;
strtest.Format(_T("%d"),nIndex);


유니코드환경에서는 _T로 포맷스트링을 감쏴줘야한다.

반응형

출처 : http://makerj.tistory.com/127

C++ String 정리 (C++ 문자열)


C++11 환경에서 정리한 글입니다

또한 using namespace std를 한 상태임을 밝힙니다



[string 생성]


1 >>

string myString = "abcd";


2 >>

string myString;

myString = "abcd";


중요!

1번 방식으로는 'a'와 같은 char로 생성이 불가능하다.

따라서 'a'와 같은 char로 생성하려면 2번 방식을 써야한다

string myString;

myString = 'a' ( O )








[string 확장, 문자열 추가]


string myString = "abc";이라는 문자열이 있다면


myString += "blahblah"; 와 같이 추가할 수 있다


또는


myString.append("blahblah");와 같이 추가할 수 있다


한 글자. 즉 char를 append로 확장하려면


myString.append("a"); 와 같이 하면 된다. myString.append('a');는 불가능하다






[string 길이]


string myString = "abc";이라는 문자열이 있다면


myString.size()

myString.length()


으로 문자열의 길이를 받을 수 있다.


*** size()와 length()는 결과가 완전히 동일하다


[string 길이 2]


myString.capacity()는 실제로 myString이 갖고 있는 길이를 반환한다

myString.max_size()는 myString이 최대로 갖을 수 있는 길이를 반환한다








[string의 특정 위치 문자 받기 (charAt 기능) ]


string myString = "abc";이라는 문자열이 있다면


myString.at(0) >>>>> 'a' 반환

myString.at(1) >>>>> 'b' 반환


이와같이 java의 charAt과 같은 기능을 수행한다.








[string에 있는 특정 문자 검색]


string myString = "This is my String";이라는 문자열이 있다면


myString.find("my");를 통해 "my"라는 문자열이 시작되는 위치를 반환한다


이를 활용하면


if (myString.find("my") != string::npos) {


 // "my"라는 문자열을 찾았을 때의 동작


}


으로 활용 가능하다








[string간의 문자열 복사]


string myString  = "acs";


string myString2 ;

myString2 = myString;


이게 다다.


myString의 문자열이 나중에 "bdjxzxddx"라고 바뀐다고 해도

myString2의 문자열은 여전히 "acs"다. 결국 myString2 에는 영향을 미치지 않는다.








[string간의 문자열 비교]


string myString = "abc";

string myStirng2 = "bbc"; 라는 문자열이 있다면


myString.compare(myString2)과 같이 비교한다.


이를 활용하면,


if (myString.compare(myString2) == 0) {


  // 두 문자열이 완전히 같은 문자열일때의 처리


} else if (myString.compare(myString2) < 0) {


  // myString의 문자열이 myString2보다 사전순으로 앞일 때 처리


} else if (myString.compare(myString2) > 0) {


 // myString의 문자열이 myString2보다 사전순으로 뒤일 때 처리



으로 활용 가능하다.








[string의 문자열 대체하기 (replace기능) ]


//myString의 "is" 문자열을 모두 "was"로 바꾸는 예제

string myString = "that is is is man";


int pos;

string replaceString = "was";


while( (pos = myString.find("is")) != string::npos) {


myString.replace(pos,replaceString.length(),replaceString);


}


의 방법으로 대체 가능하다.


그러나 이 방법은 대체 문자가 길어지면


기존의 문자를 덮어쓰기 하면서 대체가 이루어진다


ex) 

문자열이 "this is is is man" 일 때,

"is"를  위와 같은 방식으로 "asdgklsjdglsasdf"로 대체한다면

대체된 문자열은 "this asdgklsjdglsasdf"이 되어버린다




따라서 이 현상을 피해 기존의 문자열을 덮어쓰지 않고 진짜 대체만 한 구현은

아래와 같다. (제가 간단히 만든 것이므로 더 좋은 다른 구현방법이 많을 것입니다)


string myString = "that is is is cool is man";
string findString = "is";
string replaceString = "abcdef";

int pos;
while( (pos = myString.find(findString)) != string::npos){

	myString.erase(pos,findString.length());
	myString.insert(pos,replaceString);


}









[ 기본변수를 문자열로 ( toString 기능 ) ]

개발환경이 C++11을 지원해야함

string myString;

int myInt = 10;


myString = to_string(myInt) ;



[ 문자열을 기본변수로 ]

개발환경이 C++11을 지원해야함

string myString = "55";

int myInt ;


myInt = stoi(myString);

반응형

사용한 버젼은 CGridCtrl v2.20 이며 생성된 그리드컨트롤에

체크박스를 생성할때 아래와 같이 추가하면된다.

m_gridBinTable.SetCellType(nRow, nCol, RUNTIME_CLASS(CGridCellCheck));	//
pCell = (CGridCellCheck*)m_gridBinTable.GetCell(nRow, nCol);


+ Recent posts