Cómo convertir largo sin firmar a cadena

4 minutos de lectura

Como convertir largo sin firmar a cadena
Walidix

En el lenguaje C, ¿cómo convierto largo sin firmar valor a una cadena (carácter *) y mantener mi código fuente portátil o simplemente volver a compilarlo para que funcione en otra plataforma (¿sin reescribir el código?

Por ejemplo, si tengo sprintf(buffer, format, value)¿cómo determino el tamaño del búfer con una plataforma independiente?

  • con sprintf, cómo determinar el tamaño del búfer de manera independiente de la plataforma

    – Walidix

    25 de abril de 2010 a las 20:01

  • @Walidix la respuesta probablemente sea limites.h : en.wikipedia.org/wiki/Limits.h

    – Andréi Ciobanu

    25 de abril de 2010 a las 20:03


  • En realidad, esta es una gran debilidad de sprintf, parcialmente corregida en C++ mediante el uso de secuencias en lugar de búferes. La “respuesta” habitual es asignar un búfer muy generoso que probablemente no se desborde, dejar que sprintf genere eso y luego usar strlen para determinar la longitud real de la cadena producida, calloc un búfer de (ese tamaño + 1) y copie la cadena en eso.

    -Carl Smotricz

    25 de abril de 2010 a las 20:05

  • @Walidix: necesitas calcular log10(ULONG_MAX)

    – kennytm

    25 de abril de 2010 a las 20:09

  • Una respuesta infalible es snprintf si lo tienes. Ver mi respuesta para un poco más de detalle.

    -Carl Smotricz

    25 de abril de 2010 a las 20:09

1647532326 505 Como convertir largo sin firmar a cadena
jfs

const int n = snprintf(NULL, 0, "%lu", ulong_value);
assert(n > 0);
char buf[n+1];
int c = snprintf(buf, n+1, "%lu", ulong_value);
assert(buf[n] == '\0');
assert(c == n);

  • Tenga en cuenta el VLA (char buf[n+1];) requiere C99.

    – kennytm

    26 de abril de 2010 a las 17:56

  • 2014 y todavía estoy atascado usando Visual Studio en el trabajo para el desarrollo de Windows que no lo permite 🙁

    – Ruairi O’Brien

    23 de enero de 2014 a las 10:27

  • Excelente respuesta, y una para lanzar en la cara de las personas que piensan que no se puede hacer sin dificultad a menos que use C++. ¡¡Te estoy mirando, Carl Smotricz!!

    – Fizzix Nerd

    14 mayo 2014 a las 12:42

1647532326 549 Como convertir largo sin firmar a cadena
carl smotricz

El enfoque estándar es utilizar sprintf(buffer, "%lu", value); para escribir un representante de cadena de value para buffer. Sin embargo, el desbordamiento es un problema potencial, ya que sprintf felizmente (y sin saberlo) escribirá sobre el final de su búfer.

En realidad, esta es una gran debilidad de sprintf, parcialmente corregida en C++ mediante el uso de secuencias en lugar de búferes. La “respuesta” habitual es asignar un búfer muy generoso que es poco probable que se desborde, dejar que sprintf genere ese resultado y luego usar strlen para determinar la longitud real de la cadena producida, llamar a un búfer de (ese tamaño + 1) y copiar la cadena en ese .

Este sitio discute este y otros problemas relacionados con cierta extensión.

Algunas bibliotecas ofrecen snprintf como una alternativa que le permite especificar un tamaño de búfer máximo.

  • Sí, usaría snprintf. Es estándar y brinda soporte para resolver esto por completo.

    – Johannes Schaub – litb

    25 de abril de 2010 a las 20:10

  • Contradiciendo tu gravatar, +1 por cordura.

    – Tim Publicar

    25 de abril de 2010 a las 20:10

  • Imprimir un número es un caso en el que no necesita snprintf; puede limitar fácilmente el tamaño del búfer requerido. (Imprimiendo con %s OTOH, eso requiere precaución.)

    – Becarios Donal

    25 de abril de 2010 a las 20:12


  • Muchos programadores se sentirán mejor especificando un límite superior muy explícito con snprintf que usar consideraciones sobre el tamaño de los números para establecer matemáticamente tal límite o, peor aún, en mi opinión, jugar con logaritmos para precalcular ese tamaño.

    -Carl Smotricz

    25 de abril de 2010 a las 20:17

1647532327 229 Como convertir largo sin firmar a cadena
usuario2083050

puede escribir una función que convierta de unsigned long a str, similar a la función de biblioteca ltostr.

char *ultostr(unsigned long value, char *ptr, int base)
{
  unsigned long t = 0, res = 0;
  unsigned long tmp = value;
  int count = 0;

  if (NULL == ptr)
  {
    return NULL;
  }

  if (tmp == 0)
  {
    count++;
  }

  while(tmp > 0)
  {
    tmp = tmp/base;
    count++;
  }

  ptr += count;

  *ptr="\0";

  do
  {
    res = value - base * (t = value / base);
    if (res < 10)
    {
      * -- ptr="0" + res;
    }
    else if ((res >= 10) && (res < 16))
    {
        * --ptr="A" - 10 + res;
    }
  } while ((value = t) != 0);

  return(ptr);
}

puedes consultar mi blog aquí que explica la implementación y el uso con un ejemplo.

char buffer [50];

unsigned long a = 5;

int n=sprintf (buffer, "%lu", a);

1647532327 474 Como convertir largo sin firmar a cadena
hacer

Intenta usar sprintf:

unsigned long x=1000000;
char buffer[21];
sprintf(buffer,"%lu", x);

Editar:

Tenga en cuenta que debe asignar un búfer por adelantado y no tiene idea de cuánto tiempo serán realmente los números cuando lo haga. asumo 32 bits longs, que puede producir números de hasta 10 dígitos.

Consulte la respuesta de Carl Smotricz para obtener una mejor explicación de los problemas involucrados.

1647532327 161 Como convertir largo sin firmar a cadena
apilador

Para un valor largo, debe agregar la información de longitud ‘l’ y ‘u’ para un entero decimal sin signo,

como referencia de las opciones disponibles ver correr

#include <stdio.h>

    int main ()
    {
      unsigned long lval = 123;
      char buffer [50];
      sprintf (buffer, "%lu" , lval );
     }

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad