[c] 리눅스에서 itoa 기능은 어디에 있습니까?

itoa()숫자를 문자열로 변환하는 정말 편리한 함수입니다. 리눅스에는없는 것 같습니다 itoa(). 동등한 기능이 sprintf(str, "%d", num)있습니까? 아니면 사용해야 합니까?



답변

편집 : 죄송합니다, 나는이 기계가 libc학문적 목적을 위해 다양한 비표준 구현에 연결되어 결정적으로 비표준임을 기억해야 합니다. 😉

으로 itoa()여러 도움이 덧글에 의해 언급 한 바와 같이, 참으로 표준이 아닌, 그것을 사용하는 것이 가장 좋습니다 sprintf(target_string,"%d",source_int)(이 버퍼 오버 플로우로부터 안전하기 때문에, 더 나은 아직) 나 snprintf(target_string, size_of_target_string_in_bytes, "%d", source_int). 나는 그것이 간결하거나 시원하지 않다는 것을 알고 itoa()있지만 적어도 한 번만 쓸 수 있습니다 .Run Everywhere ™ 😉

여기에 오래된 (편집 된) 답변이 있습니다.

기술적으로 표준의 일부가 아니기 때문에 기본값 gcc libc에는 itoa()다른 여러 플랫폼과 같이 기본값 이 포함되어 있지 않다고 말하는 것이 맞습니다 . 좀 더 자세한 정보는 여기 를 참조 하십시오 . 당신이해야합니다

#include <stdlib.h>

물론 다른 플랫폼에서 Linux를 사용한 후 Linux 에서 사용 하기를 원했기 때문에 이미 알고 itoa()있습니다.하지만 위의 링크에서 도난당한 코드는 다음과 같습니다.

/* itoa example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}

산출:

Enter a number: 1750
decimal: 1750
hexadecimal: 6d6
binary: 11011010110

도움이 되었기를 바랍니다!


답변

당신이 그것을 많이 부르고 있다면, “그냥 snprintf를 사용하십시오”라는 조언은 성 가실 수 있습니다. 그래서 여기에 당신이 원하는 것이 있습니다 :

const char *my_itoa_buf(char *buf, size_t len, int num)
{
  static char loc_buf[sizeof(int) * CHAR_BITS]; /* not thread safe */

  if (!buf)
  {
    buf = loc_buf;
    len = sizeof(loc_buf);
  }

  if (snprintf(buf, len, "%d", num) == -1)
    return ""; /* or whatever */

  return buf;
}

const char *my_itoa(int num)
{ return my_itoa_buf(NULL, 0, num); }


답변

itoa표준 C 함수가 아닙니다. 당신은 당신의 자신을 구현할 수 있습니다. 이 책은 KernighanRitchie의 The C Programming Language ( 60 페이지) 의 첫 번째 판에 실 렸습니다 . C Programming Language ( “K & R2”)의 두 번째 판에는 itoa64 페이지 의 다음과 같은 구현이 포함되어 있습니다. 가장 음수를 올바르게 처리하지 못한다 는 사실을 포함하여

 /* itoa:  convert n to characters in s */
 void itoa(int n, char s[])
 {
     int i, sign;

     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
}  

reverse위에서 사용한 기능 은 두 페이지 더 일찍 구현됩니다.

 #include <string.h>

 /* reverse:  reverse string s in place */
 void reverse(char s[])
 {
     int i, j;
     char c;

     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
}  


답변

편집 : 방금 std::to_string아래에서 내 기능과 동일한 작동 방식을 발견했습니다 . C ++ 11에 도입되었으며 c ++ 0x 확장자를 사용하는 경우 4.5 이상으로 최신 버전의 gcc에서 사용할 수 있습니다.


itoagcc에서 누락
되었을뿐만 아니라 버퍼를 공급해야하기 때문에 가장 편리한 기능은 아닙니다. 나는 표현에 사용될 수있는 것이 필요했기 때문에 이것을 생각해 냈습니다.

std::string itos(int n)
{
   const int max_size = std::numeric_limits<int>::digits10 + 1 /*sign*/ + 1 /*0-terminator*/;
   char buffer[max_size] = {0};
   sprintf(buffer, "%d", n);
   return std::string(buffer);
}

일반적으로 snprintf대신 사용 하는 것이 더 안전합니다sprintf 하지만 버퍼는 오버런에 영향을받지 않도록 신중하게 조정됩니다.

예를 참조하십시오 : http://ideone.com/mKmZVE


답변

Matt J가 쓴 것처럼이 itoa있지만 표준이 아닙니다. 를 사용하면 코드가 더 이식성이 뛰어납니다 snprintf.


답변

다음 함수는 주어진 숫자의 문자열 표현을 유지하기에 충분한 메모리를 할당 한 다음 표준 sprintf방법을 사용하여 문자열 표현을이 영역에 씁니다 .

char *itoa(long n)
{
    int len = n==0 ? 1 : floor(log10l(labs(n)))+1;
    if (n<0) len++; // room for negative sign '-'

    char    *buf = calloc(sizeof(char), len+1); // +1 for null
    snprintf(buf, len+1, "%ld", n);
    return   buf;
}

free필요할 때 할당 된 메모리를 늘리는 것을 잊지 마십시오 .

char *num_str = itoa(123456789L);
// ... 
free(num_str);

NB snprintf가 n-1 바이트를 복사하므로 snprintf (buf, len + 1, “% ld”, n)를 호출해야합니다 (snprintf (buf, len, “% ld”, n)만이 아님)


답변

리눅스에서 itoa 기능은 어디에 있습니까?

Linux에는 그러한 기능이 없습니다. 대신이 코드를 사용합니다.

/*
=============
itoa

Convert integer to string

PARAMS:
- value     A 64-bit number to convert
- str       Destination buffer; should be 66 characters long for radix2, 24 - radix8, 22 - radix10, 18 - radix16.
- radix     Radix must be in range -36 .. 36. Negative values used for signed numbers.
=============
*/

char* itoa (unsigned long long  value,  char str[],  int radix)
{
    char        buf [66];
    char*       dest = buf + sizeof(buf);
    boolean     sign = false;

    if (value == 0) {
        memcpy (str, "0", 2);
        return str;
    }

    if (radix < 0) {
        radix = -radix;
        if ( (long long) value < 0) {
            value = -value;
            sign = true;
        }
    }

    *--dest = '\0';

    switch (radix)
    {
    case 16:
        while (value) {
            * --dest = '0' + (value & 0xF);
            if (*dest > '9') *dest += 'A' - '9' - 1;
            value >>= 4;
        }
        break;
    case 10:
        while (value) {
            *--dest = '0' + (value % 10);
            value /= 10;
        }
        break;

    case 8:
        while (value) {
            *--dest = '0' + (value & 7);
            value >>= 3;
        }
        break;

    case 2:
        while (value) {
            *--dest = '0' + (value & 1);
            value >>= 1;
        }
        break;

    default:            // The slow version, but universal
        while (value) {
            *--dest = '0' + (value % radix);
            if (*dest > '9') *dest += 'A' - '9' - 1;
            value /= radix;
        }
        break;
    }

    if (sign) *--dest = '-';

    memcpy (str, dest, buf +sizeof(buf) - dest);
    return str;
}