[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 함수가 아닙니다. 당신은 당신의 자신을 구현할 수 있습니다. 이 책은 Kernighan 과 Ritchie의 The C Programming Language ( 60 페이지) 의 첫 번째 판에 실 렸습니다 . C Programming Language ( “K & R2”)의 두 번째 판에는 itoa
64 페이지 의 다음과 같은 구현이 포함되어 있습니다. 가장 음수를 올바르게 처리하지 못한다 는 사실을 포함하여
/* 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에서 사용할 수 있습니다.
itoa
gcc에서 누락
되었을뿐만 아니라 버퍼를 공급해야하기 때문에 가장 편리한 기능은 아닙니다. 나는 표현에 사용될 수있는 것이 필요했기 때문에 이것을 생각해 냈습니다.
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;
}