programing

C에서 문자열로 변환

telebox 2023. 7. 16. 13:16
반응형

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);

계속하기 전에 경고해야 할 것이 있습니다.itoaANSI 함수가 아닙니다. 표준 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));

지금이다resultingStringC-'스트링'을 유지합니다.

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

반응형