문자열 > 숫자

```c
#include <stdlib.h>
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);

long int strtol(const char *nptr, char **endptr, int base);    // strtoll
unsigned long int strtoul(const char *nptr, char **endptr, int base);  //strtoull

```


직접 변환하기

```cpp

    auto i = 0;

    while (isdigit(input[pos])) i = i * 10 + input[pos++] - '0';

```


숫자 > 문자열

```c
#include <stdio.h>
int printf(const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
```


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
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환  (2) 2016.11.06
Pointer  (0) 2016.09.14