C에서 문자열로 변환
사용 중입니다.itoa()
변환 기능int
안으로string
하지만 오류가 발생하고 있습니다.
undefined reference to `itoa'
collect2: ld returned 1 exit status
이유가 뭐야?이 변환을 수행할 다른 방법이 있습니까?
사용하다snprintf
그것은 보다 더 휴대하기 쉽습니다.itoa
.
Itoa는 표준 C의 일부도 아니고 표준 C++의 일부도 아니지만 많은 컴파일러와 관련 라이브러리가 지원합니다.
의 예sprintf
char* buffer = ... allocate a buffer ...
int value = 4564;
sprintf(buffer, "%d", value);
의 예snprintf
char buffer[10];
int value = 234452;
snprintf(buffer, 10, "%d", value);
두 기능 모두 다음과 유사합니다.fprintf
그러나 출력은 스트림이 아닌 어레이에 기록됩니다.사이의 차이sprintf
그리고.snprintf
그것은snprintf
저장할 수 있는 최대 문자 수까지 기록하여 버퍼 오버런을 방지합니다.buffer
.
사용하다snprintf
모든 컴파일러에서 표준으로 사용할 수 있습니다.다음과 같이 호출하여 필요한 크기 쿼리NULL, 0
매개 변수마지막에 null에 대해 하나의 문자를 더 할당합니다.
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
계속하기 전에 경고해야 할 것이 있습니다.itoa
ANSI 함수가 아닙니다. 표준 C 함수가 아닙니다.사용해야 합니다.sprintf
변환하기 위해int
실 모양으로
itoa
세 개의 인수를 사용합니다.
- 첫 번째는 변환할 정수입니다.
- 두 번째는 문자열이 저장될 문자 배열에 대한 포인터입니다.만약 당신이 통과한다면 그 프로그램은 충돌할 수 있습니다.
char *
변수입니다. 따라서 일반 크기의 문자 배열을 전달해야 합니다. 그러면 잘 작동할 것입니다. - 마지막은 배열의 크기가 아니라 숫자의 기본입니다. 기본 10이 가장 많이 사용되는 숫자입니다.
함수는 변환된 문자열을 저장한 두 번째 인수로 포인터를 반환합니다.
itoa
는 매우 유용한 기능으로, 일부 컴파일러에서 지원됩니다. 이 기능은 모든 사람이 지원하지 않는 것이 유감입니다.atoi
.
그래도 사용하려면itoa
여기 당신이 그것을 어떻게 사용해야 하는지가 있습니다.그렇지 않은 경우 다음을 사용하여 다른 옵션을 사용할 수 있습니다.sprintf
(기본 8, 10 또는 16 출력을 원하는 한):
char str[5];
printf("15 in binary is %s\n", itoa(15, str, 2));
sprintf()를 사용하는 것이 좋습니다.
char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);
일반적으로 다음과 같은 방법이 있습니다.
char str[16]; // could be less but i'm too lazy to look for the actual the max length of an integer
snprintf(str, sizeof(str), "%d", your_integer);
직접 만들 수 있습니다.itoa
다음 기능을 사용합니다.
void my_utoa(int dataIn, char* bffr, int radix){
int temp_dataIn;
temp_dataIn = dataIn;
int stringLen=1;
while ((int)temp_dataIn/radix != 0){
temp_dataIn = (int)temp_dataIn/radix;
stringLen++;
}
//printf("stringLen = %d\n", stringLen);
temp_dataIn = dataIn;
do{
*(bffr+stringLen-1) = (temp_dataIn%radix)+'0';
temp_dataIn = (int) temp_dataIn / radix;
}while(stringLen--);}
다음은 예입니다.
char buffer[33];
int main(){
my_utoa(54321, buffer, 10);
printf(buffer);
printf("\n");
my_utoa(13579, buffer, 10);
printf(buffer);
printf("\n");
}
void itos(int value, char* str, size_t size) {
snprintf(str, size, "%d", value);
}
..참조를 통해 통화가 가능합니다.다음과 같이 사용합니다. 예:
int someIntToParse;
char resultingString[length(someIntToParse)];
itos(someIntToParse, resultingString, length(someIntToParse));
지금이다resultingString
C-'스트링'을 유지합니다.
char string[something];
sprintf(string, "%d", 42);
Ahmad Sirojuddin과 유사한 구현이지만 의미론은 약간 다릅니다.보안 관점에서 함수가 문자열 버퍼에 쓸 때마다 함수는 버퍼의 크기를 "알고" 버퍼의 끝을 지나 쓰기를 거부해야 합니다.그것이 당신이 그것을 더 이상 찾을 수 없는 이유의 일부라고 생각합니다.
또한 다음 구현에서는 모듈/디바이스 작업을 두 번 수행하지 않아도 됩니다.
char *u32todec( uint32_t value,
char *buf,
int size)
{
if(size > 1){
int i=size-1, offset, bytes;
buf[i--]='\0';
do{
buf[i--]=(value % 10)+'0';
value = value/10;
}while((value > 0) && (i>=0));
offset=i+1;
if(offset > 0){
bytes=size-i-1;
for(i=0;i<bytes;i++)
buf[i]=buf[i+offset];
}
return buf;
}else
return NULL;
}
다음 코드는 위의 코드를 테스트하고 정확성을 보여줍니다.
int main(void)
{
uint64_t acc;
uint32_t inc;
char buf[16];
size_t bufsize;
for(acc=0, inc=7; acc<0x100000000; acc+=inc){
printf("%u: ", (uint32_t)acc);
for(bufsize=17; bufsize>0; bufsize/=2){
if(NULL != u32todec((uint32_t)acc, buf, bufsize))
printf("%s ", buf);
}
printf("\n");
if(acc/inc > 9)
inc*=7;
}
return 0;
}
Edwin이 제안한 것처럼 snprintf를 사용합니다.
#include <stdio.h>
int main(int argc, const char *argv[])
{
int n = 1234;
char buf[10];
snprintf(buf, 10, "%d", n);
printf("%s\n", buf);
return 0;
}
이 파일을 에 사용하려면 표준 라이브러리 헤더를 포함해야 합니다.
#include <stdlib.h>
에는 (MSVC를 사용하여) Windows를 사용하는 itoa
은 실은사입니다._itoa
.
http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx 을 참조하십시오.
다시 말씀드리지만, 당신이 메시지를 받고 있기 때문에.collect2
*nix에서 GCC를 실행하고 있을 가능성이 높습니다.
이 예를 참조하십시오.
#include <stdlib.h> // for itoa() call
#include <stdio.h>
int main() {
int num = 145;
char buf[5];
// convert 123 to string [buf]
itoa(num, buf, 10);
// print our string
printf("%s\n", buf);
return 0;
}
다른 예제가 있는 이 링크를 참조하십시오.
ito() 함수는 ANSI-C에 정의되어 있지 않으므로 일부 플랫폼(Reference Link)에서는 기본적으로 구현되지 않습니다.
s(n)printf() 함수는 »로 가장 쉽게 대체할 수 있습니다.그러나 ito(ascii로의 정수) 함수는 정수에서 ascii로의 변환 문제의 전반적인 더 나은 솔루션으로 사용될 수 있습니다.
ito()는 구현에 따라 성능도 s(n)printf()보다 우수합니다.예를 들어 ITO(10개의 radix만 지원) 구현으로 축소: 참조 링크
또 다른 완전한 구현은 다음과 같습니다(참조 링크).
#include <stdbool.h>
#include <string.h>
// A utility function to reverse a string
char *reverse(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
// Implementation of itoa()
char* itoa(int num, char* str, int base)
{
int i = 0;
bool isNegative = false;
/* Handle 0 explicitely, otherwise empty string is printed for 0 */
if (num == 0)
{
str[i++] = '0';
str[i] = '\0';
return str;
}
// In standard itoa(), negative numbers are handled only with
// base 10. Otherwise numbers are considered unsigned.
if (num < 0 && base == 10)
{
isNegative = true;
num = -num;
}
// Process individual digits
while (num != 0)
{
int rem = num % base;
str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
num = num/base;
}
// If number is negative, append '-'
if (isNegative)
str[i++] = '-';
str[i] = '\0'; // Append string terminator
// Reverse the string
reverse(str);
return str;
}
또 다른 완전한 구현:참조 링크
아래의 itoa() 사용 예(참조 링크):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a=54325;
char buffer[20];
itoa(a,buffer,2); // here 2 means binary
printf("Binary value = %s\n", buffer);
itoa(a,buffer,10); // here 10 means decimal
printf("Decimal value = %s\n", buffer);
itoa(a,buffer,16); // here 16 means Hexadecimal
printf("Hexadecimal value = %s\n", buffer);
return 0;
}
if(InNumber == 0)
{
return TEXT("0");
}
const int32 CharsBufferSize = 64; // enought for int128 type
TCHAR ResultChars[CharsBufferSize];
int32 Number = InNumber;
// Defines Decreasing/Ascending ten-Digits to determine each digit in negative and positive numbers.
const TCHAR* DigitalChars = TEXT("9876543210123456789");
constexpr int32 ZeroCharIndex = 9; // Position of the ZERO character from the DigitalChars.
constexpr int32 Base = 10; // base system of the number.
// Convert each digit of the number to a digital char from the top down.
int32 CharIndex = CharsBufferSize - 1;
for(; Number != 0 && CharIndex > INDEX_NONE; --CharIndex)
{
const int32 CharToInsert = ZeroCharIndex + (Number % Base);
ResultChars[CharIndex] = DigitalChars[CharToInsert];
Number /= Base;
}
// Insert sign if is negative number to left of the digital chars.
if(InNumber < 0 && CharIndex > INDEX_NONE)
{
ResultChars[CharIndex] = L'-';
}
else
{
// return to the first digital char if is unsigned number.
++CharIndex;
}
// Get number of the converted chars and construct string to return.
const int32 ResultSize = CharsBufferSize - CharIndex;
return TString{&ResultChars[CharIndex], ResultSize};
언급URL : https://stackoverflow.com/questions/5242524/converting-int-to-string-in-c
'programing' 카테고리의 다른 글
'DataFrame' 개체에 'sort' 특성이 없습니다. (0) | 2023.07.21 |
---|---|
PL/SQL 코드 검색 (0) | 2023.07.16 |
역할 환경을 호출할 때 SHE 예외가 발생하는 이유는 무엇입니까?구성 설정 값("MYKEY")을 가져오시겠습니까? (0) | 2023.07.16 |
SQL에서 ON 절과 using 절의 차이 (0) | 2023.07.16 |
mysql은 오라클의 "분석 기능"과 동등합니까? (0) | 2023.07.16 |