#include <iostream>
#include <string>
#define MAX_STRING 512
using std::cout; using std::cin;
using std::string;
void CharFrequency(string context, string &result);
int _tmain(int argc, _TCHAR* argv[])
{
string context, result ;
cout << "Please enter the context: ";
//cin.getline(cin,char *타입변수);
getline(cin,context,'\n'); //getline(cin,context,'\n');
//cin자체는 공백구분, 엔터구분이다.
CharFrequency(context,result); //빈도수를 계산, 결과를 result변수에 담는다.
cout << result;
return 0;
}
/**********************************************
CharFrequency : 문자열에서 문자빈도수체크함수
input : string , string &
output : 레퍼런스로 들어온 두번째 인자에 저장된다.
ex) string context = "deefsddq"-> string result : "d3e2f1s1q1"
***********************************************/
void CharFrequency(string context, string &result)
{
char character[MAX_STRING]; //찾은 문자 저장 배열
int num[MAX_STRING]; //찾은 문자 갯수 저장 배열
const char *c_context = context.c_str(); //string에서 cstring 배열타입으로 변환
int count=0, erase_count = 0, length = context.length(); //count -> 찾은 문자 갯수(중복제외), erase_count-> 지운 문자 갯수
while(erase_count < length) //지운 문자 갯수보다 문장의 길이보다 작을때까지
{
character[count] = c_context[0]; //처음문자를 받아온다.
num[count] = 0; //처음문자갯수를 0으로 초기화
string::size_type begin = 0 , end = context.size(); //context값의 begin값과 end값 설정
while(begin < end) //begin값부터 end값까지 반복한다.
{
string::size_type index = context.find(character[count],begin); //token을 context에서 찾아서 해당인덱스반환
if(index == string::npos) //검색함수가 실패했을때 string::npos를 반환한다.
break; //더이상없다.
num[count]++; //찾은 문자갯수 플러스
context.erase(index,1); //찾은 문자를 string문장에서 제거한다.
erase_count++; //지운문자를 플러스
}
count++;
}
string::iterator pos = result.begin();
char r_num[50] = {NULL,};
for(int n=count-1;n>=0;n--) //뒤에서부터
{
itoa(num[n],r_num,10); //문자로 변환
for(int r=49 ; r>=0 ; r--)
{
if(r_num[r] != NULL)
pos = result.insert(pos,r_num[r]); //갯수 추가
}
pos = result.insert(pos,character[n]); // 문자 추가
}
}