글 수 204
LPSTR ConvertHex(LPCSTR source){
size_t Len=strlen(source);
char Temp[2048]="";
BYTE szBuf[3] = { ' ', };
int j=0;
for(size_t i=0;i<Len;i++){
szBuf[0]=(BYTE) source[i];
szBuf[1]=(BYTE) source[i+1];
if(szBuf[0]<0x80){ //1바이트 코드라면
j += sprintf(Temp+j,"%02X ",szBuf[0]);
}
else{ //2바이트라면
j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
i++;
}
}
LPSTR Temp2=Temp;
return Temp2;
}
이렇게 완성을 했는데,
출력이 안됩니다.[...]
문제가 있는걸까요
size_t Len=strlen(source);
char Temp[2048]="";
BYTE szBuf[3] = { ' ', };
int j=0;
for(size_t i=0;i<Len;i++){
szBuf[0]=(BYTE) source[i];
szBuf[1]=(BYTE) source[i+1];
if(szBuf[0]<0x80){ //1바이트 코드라면
j += sprintf(Temp+j,"%02X ",szBuf[0]);
}
else{ //2바이트라면
j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
i++;
}
}
LPSTR Temp2=Temp;
return Temp2;
}
이렇게 완성을 했는데,
출력이 안됩니다.[...]
문제가 있는걸까요
whoami
- 2008.08.02
- 20:39:32
따라서.. 위와 같이 하면 안되고요.
방법 1. static 혹은 전역변수를 사용하는 방법 (비추)
LPSTR ConvertHex(LPCSTR source){
....
static char Temp[2048]=""; // static 변수
return Temp;
}
혹은
char Temp[2048]; // 전역변수
LPSTR ConvertHex(LPCSTR source){
....
return Temp;
}
방법 2. 버퍼를 부르는 측에서 같이 보내는 방법 (추천)
LPSTR ConvertHex(LPCSTR source, LPSTR Temp)
{
...
return Temp;
}
int main()
{
char Temp[2048];
....
ConvertHex(source, Temp);
}
방법 1. static 혹은 전역변수를 사용하는 방법 (비추)
LPSTR ConvertHex(LPCSTR source){
....
static char Temp[2048]=""; // static 변수
return Temp;
}
혹은
char Temp[2048]; // 전역변수
LPSTR ConvertHex(LPCSTR source){
....
return Temp;
}
방법 2. 버퍼를 부르는 측에서 같이 보내는 방법 (추천)
LPSTR ConvertHex(LPCSTR source, LPSTR Temp)
{
...
return Temp;
}
int main()
{
char Temp[2048];
....
ConvertHex(source, Temp);
}
Hide_D
- 2008.08.02
- 20:48:12
LPSTR ConvertHex(LPCSTR source,LPSTR complete){
size_t Len=strlen(source);
char Temp[2048]="";
BYTE szBuf[3] = { ' ', };
int j=0;
for(size_t i=0;i<Len;i++){
szBuf[0]=(BYTE) source[i];
szBuf[1]=(BYTE) source[i+1];
if(szBuf[0]<0x80){ //1바이트 코드라면
j += sprintf(Temp+j,"%02X ",szBuf[0]);
}
else{ //2바이트라면
j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
i++;
}
}
complete=Temp;
return complete;
}
이렇게 바꿔도 안나오네요;
size_t Len=strlen(source);
char Temp[2048]="";
BYTE szBuf[3] = { ' ', };
int j=0;
for(size_t i=0;i<Len;i++){
szBuf[0]=(BYTE) source[i];
szBuf[1]=(BYTE) source[i+1];
if(szBuf[0]<0x80){ //1바이트 코드라면
j += sprintf(Temp+j,"%02X ",szBuf[0]);
}
else{ //2바이트라면
j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
i++;
}
}
complete=Temp;
return complete;
}
이렇게 바꿔도 안나오네요;
whoami
- 2008.08.02
- 20:56:49
그러니까..
LPSTR ConvertHex(LPCSTR source,LPSTR complete){
char Temp[2048]=""; // Temp 변수 (2048개짜리 char 배열) 가 생성
... 중략 ...
complete=Temp; // complete 는 Temp 라는 배열을 가리킴
return complete; // complete 라는 변수의 내용 (Temp배열이 *있던* 자리를 가리키고 있음) 만 넘겨줌
} // 여기서 Temp 라는 배열 그 자체가 없어짐 = 중간에 했던 모든 Hex 변환 작업 자체가 사라진다는 뜻임.
고치려면..
LPSTR ConvertHex(LPCSTR source,LPSTR Temp){
size_t Len=strlen(source);
// char Temp[2048]=""; // 이걸 지웁니다.
BYTE szBuf[3] = { ' ', };
int j=0;
for(size_t i=0;i<Len;i++){
szBuf[0]=(BYTE) source[i];
szBuf[1]=(BYTE) source[i+1];
if(szBuf[0]<0x80){ //1바이트 코드라면
j += sprintf(Temp+j,"%02X ",szBuf[0]);
}
else{ //2바이트라면
j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
i++;
}
}
return Temp;
}
void SomeFunc()
{
// ... 생략 ...
char complete[2048] = ""; // 여기서 버퍼의 실체를 생성
ConvertHex(source, complete);
// 이제 complete 내에 ConvertHex 내에 작업한 모든 데이타가 담겨있음.
}
LPSTR ConvertHex(LPCSTR source,LPSTR complete){
char Temp[2048]=""; // Temp 변수 (2048개짜리 char 배열) 가 생성
... 중략 ...
complete=Temp; // complete 는 Temp 라는 배열을 가리킴
return complete; // complete 라는 변수의 내용 (Temp배열이 *있던* 자리를 가리키고 있음) 만 넘겨줌
} // 여기서 Temp 라는 배열 그 자체가 없어짐 = 중간에 했던 모든 Hex 변환 작업 자체가 사라진다는 뜻임.
고치려면..
LPSTR ConvertHex(LPCSTR source,LPSTR Temp){
size_t Len=strlen(source);
// char Temp[2048]=""; // 이걸 지웁니다.
BYTE szBuf[3] = { ' ', };
int j=0;
for(size_t i=0;i<Len;i++){
szBuf[0]=(BYTE) source[i];
szBuf[1]=(BYTE) source[i+1];
if(szBuf[0]<0x80){ //1바이트 코드라면
j += sprintf(Temp+j,"%02X ",szBuf[0]);
}
else{ //2바이트라면
j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
i++;
}
}
return Temp;
}
void SomeFunc()
{
// ... 생략 ...
char complete[2048] = ""; // 여기서 버퍼의 실체를 생성
ConvertHex(source, complete);
// 이제 complete 내에 ConvertHex 내에 작업한 모든 데이타가 담겨있음.
}
Hide_D군님은 변수의 범위랄까.. scope 라고 하는데.. 그것에 대한 개념이 잡히지 않으셨군요.
int *SomeFunc()
{ // 블럭 1
int i = 3; // 변수 i 생성
int *pi = &i; // pi 는 i 를 가리키는 포인터. 예를 들어 i 가 1000번지에 있다고 하면 pi = 1000 (번지)
{ // 블럭 2
int j = 4; // 변수 j 생성
{ // 블럭 3
int i = 5; // 새로운 변수 i 생성. 이 단계에서 윗부분의 i 와 이 i 는 서로 다름.
printf("i=%dn", i); // i = 5
} // 블럭 3의 끝. 이걸 넘어가면서 두번째 i 는 사라짐. 곧 두번째 i 는 블럭 3에서만 통용되는 변수
printf("i = %dn", i); // i = 3
} // 블럭 2의 끝. 이걸 넘어가면 j 는 사라짐.
printf("j = %dn", j); // 에러. j 가 사라졌음.
return pi;
} // 블럭 1의 끝. 여기서 첫번째 i 는 사라짐.
int main()
{
int *pi;
pi = SomeFunc(); // 여기서 pi = 1000 (번지).
printf("i = %d", *pi); // 분명히 pi 는 1000번지의 i 를 가리키고 있었지만 SomeFunc() 가 끝나는 시점에 i 는 삭제.
// 따라서 i = 3 이 나올 거라 생각했지만 실제로는 그렇게 나오지 않는다.
}