[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환
문자열 > 숫자
```
직접 변환하기
```cpp
auto i = 0;
while (isdigit(input[pos])) i = i * 10 + input[pos++] - '0';
```
숫자 > 문자열
shell output clear & cursor return to top
```c
snprintf(&s, 0x80u, "%c[2J%c[0;0H", 27, 27); // shell output clear
snprintf(&s, 0x80u, "%c[%d;%dH", 27, 5, 5); // shell cursor return to top
```
문자열 인풋 그대로 16진수로 변환
문자열 "bfffeeac"을 integer bfffeeac로 저장
- ``c strtol()``계열 함수를 이용해야 한다. ``c atoi()``는 16진수를 지원 안하기 때문에 a, f같은 문자 만날 시 그 전까지만 변환된다.
- MSB까지 입력해야 하기 때문에 ``c strtol()``이 아니라 ``c strtoul()``을 이용해야 한다.
``c strtol()``을 사용하면 MSB를 제외한 31bit만 사용하기 때문에 ``7fffffff``가 최대값이다.
```c
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
char str[256];
char dst[9];
unsigned int addr=0;
char* cp;
strcpy( str, argv[1] );
strncpy( dst, argv[1], 8);
dst[8] = 0;
addr = strtoul(dst, NULL, 16);
cp = (char*)addr;
printf( str );
printf("\naddr %p", &addr);
printf("\n\n%p : %02x %02x %02x %02x\n", cp, cp[3], cp[2], cp[1], cp[0]);
return 0;
}
shift를 이용해 직접 구현할 경우
이 경우 직접 char에 원하는 hex value를 넣어 간단히 처리했지만, 문자열로 입력받는 경우 해당 문자 그대로의 hex value를 얻는게 또 문제다. 이래 저래 strtol을 쓰는게 현명하다.
```c
int main( int argc, char *argv[] )
{
int addr=0;
char tt[4];
tt[0]=0x41;
tt[1]=0x42;
tt[2]=0x43;
tt[3]=0x44;
addr|=tt[3]<<24;
addr|=tt[2]<<16;
addr|=tt[1]<<8;
addr|=tt[0];
printf("%x", addr);
return 0;
}
'Languages & Frameworks > C C++' 카테고리의 다른 글
exec 계열 함수 (0) | 2017.05.01 |
---|---|
fork - exec / wait +clone (0) | 2017.05.01 |
Assembly (0) | 2016.11.18 |
[C] printf, scanf계열 (0) | 2016.11.10 |
Pointer (0) | 2016.09.14 |