float - strtoint c++
Conversión de int a cadena en C (12)
Estoy usando la función itoa()
para convertir un int
en string
, pero está dando un error:
undefined reference to `itoa''
collect2: ld returned 1 exit status
¿Cual es la razon? ¿Hay alguna otra forma de realizar esta conversión?
Antes de continuar, debo advertirle que itoa
NO es una función ANSI, no es una función C estándar. Deberías usar sprintf
para convertir un int
en una cadena.
itoa
toma tres argumentos.
- El primero es el número entero a convertir.
- El segundo es un puntero a una matriz de caracteres: aquí es donde se va a almacenar la cadena. El programa puede bloquearse si pasa una variable
char *
, por lo que debe pasar una matriz de caracteres de tamaño normal y funcionará correctamente. - El último NO es del tamaño de la matriz, pero es la BASE de su número; la base 10 es la que más probablemente use.
La función devuelve un puntero a su segundo argumento, donde ha almacenado la cadena convertida.
itoa
es una función muy útil, que es compatible con algunos compiladores, es una pena que no sea compatible por todos, a diferencia de atoi
.
Si aún desea usar itoa
, aquí está cómo debería usarlo. De lo contrario, tienes otra opción para usar sprintf
(siempre que quieras una base 8, 10 o 16 de salida):
char str[5];
printf("15 in binary is %s/n", itoa(15, str, 2));
Como sugirió Edwin, use 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;
}
Implementación similar a Ahmad Sirojuddin pero semántica ligeramente diferente. Desde una perspectiva de seguridad, cada vez que una función escribe en un búfer de cadena, la función realmente debe "conocer" el tamaño del búfer y negarse a escribir más allá del final del mismo. Supongo que es parte de la razón por la que ya no puedes encontrar itoa.
Además, la siguiente implementación evita realizar la operación de módulo / devide dos veces.
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;
}
El siguiente código prueba el código anterior y demuestra su corrección:
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;
}
Mejor uso sprintf (),
char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);
Puedes hacer tu propia itoa
, con esta función:
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--);}
y este es un ejemplo:
char buffer[33];
int main(){
my_utoa(54321, buffer, 10);
printf(buffer);
printf("/n");
my_utoa(13579, buffer, 10);
printf(buffer);
printf("/n");
}
Si realmente desea usar itoa, debe incluir el encabezado de biblioteca estándar.
#include <stdlib.h>
También creo que si estás en Windows (usando MSVC), entonces itoa
es en realidad _itoa
.
Ver http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx
Por otra parte, dado que está recibiendo un mensaje de collect2
, es probable que ejecute GCC en * nix.
Use snprintf
, es más portátil que itoa
.
itoa no es parte del estándar C, ni es parte del estándar C ++ ; pero, muchos compiladores y bibliotecas asociadas lo admiten.
Ejemplo de sprintf
char* buffer = ... allocate a buffer ...
int value = 4564;
sprintf(buffer, "%d", value);
Ejemplo de snprintf
char buffer[10];
int value = 234452;
snprintf(buffer, 10, "%d", value);
Ambas funciones son similares a fprintf
, pero la salida se escribe en una matriz en lugar de en una secuencia. La diferencia entre sprintf
y snprintf
es que snprintf
garantiza que no se sobrepase el búfer escribiendo hasta un número máximo de caracteres que se pueden almacenar en el buffer
.
Use snprintf
: es estándar y está disponible en todos los compiladores. Consúltelo para el tamaño necesario llamándolo con NULL, 0
parámetros. Asigne un carácter más para null al final.
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
Usualmente snprintf()
es el camino a seguir:
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);
mira este ejemplo
#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;
}
ver este link con otros ejemplos.
char string[something];
sprintf(string, "%d", 42);
void itos(int value, char* str, size_t size) {
snprintf(str, size, "%d", value);
}
.. trabaja con llamada por referencia . Úselo así por ejemplo:
int someIntToParse;
char resultingString[length(someIntToParse)];
itos(someIntToParse, resultingString, length(someIntToParse));
ahora resultString mantendrá su C-string ''.