어떻게 하면 C에서 int를 문자열로 변환할 수 있습니까?
어떻게 변환합니까?int
끈으로?
데이터를 변환하는 함수를 만들려고 합니다.struct
파일에 저장할 문자열로 변환합니다.
사용할 수 있습니다.sprintf
그것을 하기 위해, 또는 아마도.snprintf
가지고 계신 경우:
char str[ENOUGH];
sprintf(str, "%d", 42);
여기서 문자 수(+종료 문자 수)는str
다음을 사용하여 계산할 수 있습니다.
(int)((ceil(log10(num))+1)*sizeof(char))
댓글에서 지적했듯이,itoa()
는 표준이 아니므로 경쟁 답변에 제시된 sprintf() 접근 방식을 사용하는 것이 좋습니다!
사용할 수 있습니다.itoa()
정수 값을 문자열로 변환하는 함수입니다.
다음은 예입니다.
int num = 321;
char snum[5];
// Convert 123 to string [buf]
itoa(num, snum, 10);
// Print our string
printf("%s\n", snum);
구조를 파일로 출력하려는 경우 사전에 값을 변환할 필요가 없습니다.printf 형식 지정을 사용하여 값을 출력하는 방법과 printf 패밀리의 연산자를 사용하여 데이터를 출력하는 방법을 나타낼 수 있습니다.
간단한 대답은 다음과 같습니다.
snprintf( str, size, "%d", x );
긴 길이는 다음과 같습니다. 먼저 충분한 크기를 찾아야 합니다. snprintf
로 부르면 길이를 알려줍니다.NULL, 0
첫 번째 매개 변수로:
snprintf( NULL, 0, "%d", x );
null-terminator에 대해 한 문자를 더 할당합니다.
#include <stdio.h>
#include <stdlib.h>
int x = -42;
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
모든 형식 문자열에 대해 작동하는 경우 다음을 사용하여 float 또는 double을 문자열로 변환할 수 있습니다."%g"
다음을 사용하여 int를 16진수로 변환할 수 있습니다."%x"
등등.
gcc에 대한 itoa의 다양한 버전을 살펴본 결과, 양수와 음수 모두 2진수, 10진수 및 16진수로의 변환을 처리할 수 있는 가장 유연한 버전은 http://www.strudel.org.uk/itoa/ 에서 찾을 수 있는 네 번째 버전입니다.하는 동안에sprintf
/snprintf
장점이 있습니다. 십진수 변환 이외의 다른 값에 대해서는 음수를 처리하지 않습니다.위 링크가 오프라인이거나 더 이상 활성화되지 않았기 때문에 아래에 4번째 버전을 포함했습니다.
/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/
char* itoa(int value, char* result, int base) {
// check that the base if valid
if (base < 2 || base > 36) { *result = '\0'; return result; }
char* ptr = result, *ptr1 = result, tmp_char;
int tmp_value;
do {
tmp_value = value;
value /= base;
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
} while ( value );
// Apply negative sign
if (tmp_value < 0) *ptr++ = '-';
*ptr-- = '\0';
while(ptr1 < ptr) {
tmp_char = *ptr;
*ptr--= *ptr1;
*ptr1++ = tmp_char;
}
return result;
}
다른 방법이 있습니다.
#include <stdio.h>
#define atoa(x) #x
int main(int argc, char *argv[])
{
char *string = atoa(1234567890);
printf("%s\n", string);
return 0;
}
어떤 것이든 문자열로 변환하는 것은 1) 결과 문자열을 할당하거나 2) 전달해야 합니다.char *
대상 및 크기.아래의 샘플 코드:
둘 다 모두에게 효과가 있습니다.int
포함하여INT_MIN
다음과 달리 일관된 출력을 제공합니다.snprintf()
현재 로케일에 따라 다릅니다.
방법 1: 반품NULL
메모리 부족으로
#define INT_DECIMAL_STRING_SIZE(int_type) ((CHAR_BIT*sizeof(int_type)-1)*10/33+3)
char *int_to_string_alloc(int x) {
int i = x;
char buf[INT_DECIMAL_STRING_SIZE(int)];
char *p = &buf[sizeof buf] - 1;
*p = '\0';
if (i >= 0) {
i = -i;
}
do {
p--;
*p = (char) ('0' - i % 10);
i /= 10;
} while (i);
if (x < 0) {
p--;
*p = '-';
}
size_t len = (size_t) (&buf[sizeof buf] - p);
char *s = malloc(len);
if (s) {
memcpy(s, p, len);
}
return s;
}
방법 2: 그것은 돌아옵니다.NULL
버퍼가 너무 작은 경우.
static char *int_to_string_helper(char *dest, size_t n, int x) {
if (n == 0) {
return NULL;
}
if (x <= -10) {
dest = int_to_string_helper(dest, n - 1, x / 10);
if (dest == NULL) return NULL;
}
*dest = (char) ('0' - x % 10);
return dest + 1;
}
char *int_to_string(char *dest, size_t n, int x) {
char *p = dest;
if (n == 0) {
return NULL;
}
n--;
if (x < 0) {
if (n == 0) return NULL;
n--;
*p++ = '-';
} else {
x = -x;
}
p = int_to_string_helper(p, n, x);
if (p == NULL) return NULL;
*p = 0;
return dest;
}
@Alter Mann의 요청에 따라 [편집]
(CHAR_BIT*sizeof(int_type)-1)*10/33+3
의 최대 수 이상입니다.char
일부 부호 있는 정수 유형을 선택적인 음수 기호, 숫자 및 null 문자로 구성된 문자열로 인코딩하는 데 필요합니다.
없는 는 부 있 는 정 의 부 없 비 는 수 다 같 과 습 다 니 음 는 호CHAR_BIT*sizeof(int_type)-1
10 현표의 n
-bit 이는다차다니합지까지 합니다.n*log10(2) + 1
숫자들 10/33
보다 약간 더 많습니다.log10(2)
에한대호기 +char
문자에 는 +다른 분수는 28/93과 같이 사용될 수 있습니다.
방법 3: 가장자리에 살고 싶고 버퍼 오버플로가 문제가 되지 않는다면 간단한 C99 이상의 솔루션이 모든 것을 처리합니다. int
.
#include <limits.h>
#include <stdio.h>
static char *itoa_simple_helper(char *dest, int i) {
if (i <= -10) {
dest = itoa_simple_helper(dest, i/10);
}
*dest++ = '0' - i%10;
return dest;
}
char *itoa_simple(char *dest, int i) {
char *s = dest;
if (i < 0) {
*s++ = '-';
} else {
i = -i;
}
*itoa_simple_helper(s, i) = '\0';
return dest;
}
int main() {
char s[100];
puts(itoa_simple(s, 0));
puts(itoa_simple(s, 1));
puts(itoa_simple(s, -1));
puts(itoa_simple(s, 12345));
puts(itoa_simple(s, INT_MAX-1));
puts(itoa_simple(s, INT_MAX));
puts(itoa_simple(s, INT_MIN+1));
puts(itoa_simple(s, INT_MIN));
}
샘플 출력
0
1
-1
12345
2147483646
2147483647
-2147483647
-2147483648
GCC를 사용하는 경우 GNU 확장자를 printf 함수로 사용할 수 있습니다.
char* str;
asprintf(&str, "%i", 12313);
free(str);
sprintf는 바이트를 반환하고 null 바이트도 추가합니다.
# include <stdio.h>
# include <string.h>
int main() {
char buf[1024];
int n = sprintf( buf, "%d", 2415);
printf("%s %d\n", buf, n);
}
출력:
2415 4
/* Function return size of string and convert signed *
* integer to ascii value and store them in array of *
* character with NULL at the end of the array */
int itoa(int value, char *ptr)
{
int count = 0, temp;
if(ptr == NULL)
return 0;
if(value == 0)
{
*ptr = '0';
return 1;
}
if(value < 0)
{
value* = (-1);
*ptr++ = '-';
count++;
}
for(temp=value; temp>0; temp/=10, ptr++);
*ptr = '\0';
for(temp=value; temp>0; temp/=10)
{
*--ptr = temp%10 + '0';
count++;
}
return count;
}
신관 응답이 향상되었습니다.
포함:
#include <math.h> // log10, floor
#include <stdio.h> // sprintf
#include <stdlib.h> // abs
번호 만들기:
int num = 123;
길이 계산:
size_t len;
if (abs(num)) { // if not zero
len = floor(log10(abs(num)) + 1); // taking 'round' numbers into account too
if (num < 0) len++; // add minus sign
} else { // if zero
len = 1;
}
그런 다음 문자열을 로컬 변수로 저장할 수 있습니다.
char str[len];
sprintf(str, "%d", num);
// do stuff
또는 포인터로:
char *str = malloc(len * sizeof(char));
sprintf(str, "%d", num);
// do stuff
free(str);
도움이 되길 바랍니다!
사용하기itoa()
정수를 문자열로 변환하다
예:
char msg[30];
int num = 10;
itoa(num,msg,10);
언급URL : https://stackoverflow.com/questions/8257714/how-can-i-convert-an-int-to-a-string-in-c
'source' 카테고리의 다른 글
기록에 보관하지 않고 명령 실행 (0) | 2023.05.05 |
---|---|
Bash 명령 프롬프트에 git 분기 추가 (0) | 2023.05.05 |
Azure/에서 과도한 HTTP 응답 헤더 제거/숨기기/사용 안 함UrlScan이 없는 IIS7 (0) | 2023.05.05 |
MongoDB vs.카산드라 vs.실시간 광고 플랫폼용 MySQL (0) | 2023.05.05 |
Postgres: INSERT(이미 존재하지 않는 경우) (0) | 2023.05.05 |