¿Cómo imprimo una cadena no terminada en nulo usando printf?

3 minutos de lectura

avatar de usuario
Miguel

¿Cómo puedo imprimir una cadena no terminada en nulo usando printf, suponiendo que conozco la longitud de la cadena en tiempo de ejecución?

  • Si no termina en nulo, entonces, por definición, no es una cadena.

    –Keith Thompson

    4 de agosto de 2014 a las 3:36

  • solo que no es un cuerda Cya que sería una cadena válida en otros idiomas … y aunque una “matriz de caracteres no terminada en nulo” sería más precisa, estoy bastante seguro de que se entendió universalmente.

    – Willdorf

    29 de julio de 2016 a las 19:58


  • Posible duplicado de Uso de printf con una cadena terminada no nula

    – Emlai

    01/04/2017 a las 19:06

avatar de usuario
kennytm

printf("%.*s", length, string);

Usar junto con otros argumentos:

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
//                         ^^^^                       ^^^^^^^^^^^^^^

En C, puede especificar la longitud máxima de salida con el %.123s formato. Esto significa que la longitud de salida es de 123 caracteres como máximo. los 123 podría ser reemplazado por *de modo que la longitud se tomará del argumento de printf en lugar del codificado.

Tenga en cuenta que esto supone la string no contiene ningún byte nulo interior (\0), como %.123s solo limita la máximo longitud no la exacto longitud, y las cadenas aún se tratan como terminadas en nulo.

Si desea imprimir una cadena no terminada en nulo con nulo interior, no puede usar un solo printf. Utilizar fwrite en lugar de:

fwrite(string, 1, length, stdout);

Consulte la respuesta de @MSDousti para obtener una explicación detallada.

  • Nota: length debe tener tipo int aquí, después de las promociones de argumentos predeterminados. Si tu length variable es algo más grande (p. ej. size_t) deberías lanzarlo a (int) de lo contrario, su código se romperá en una plataforma donde size_t es más ancho que int.

    –MM

    4 de agosto de 2014 a las 4:25

avatar de usuario
MS Dousti

La respuesta proporcionada por @KennyTM es excelente, pero con sutileza.

En general, si la cadena no es nula “terminada”, pero tiene un carácter nulo en el medio, printf("%.*s", length, string); no funciona como se esperaba. Esto se debe a que el %.*s cadena de formato pregunta printf para imprimir un máximo de length personajes, no exactamente length caracteres.

Prefiero usar la solución más general señalada por @William Pursell en un comentario debajo del OP:

fwrite(string, sizeof(char), length, stdout);

Aquí hay un código de muestra:

#include <stdio.h>

int main(void) {
    size_t length = 5;

    char string[length];
    string[0] = 'A';
    string[1] = 'B';
    string[2] = 0;        // null character in the middle
    string[3] = 'C';
    string[4] = 'D';

    printf("With printf: %.*s\n", length, string);
    printf("With fwrite: ");
    fwrite(string, sizeof(char), length, stdout);
    printf("\n");

    return 0;
}

Producción:

With printf: AB
With fwrite: AB CD

  • sizeof (char) es 1 por definición. También, NULL es específicamente un nulo puntero constante.

    –Keith Thompson

    4 de agosto de 2014 a las 3:37


  • @KeithThompson, sizeof (char) es más semántico. También, '\0' es más semántico que 0. Pero a quién le importa 😉

    – Iván Negro

    12 de enero de 2017 a las 15:58

  • Mi salida para esto es With fwrite: AB – parece detenerse en el terminador nulo. Compilado con gcc 4.8.5

    – Mateo Moisés

    29 de febrero de 2020 a las 17:08

  • @MatthewMoisen: Ver Salida de perno divino para su compilador.

    – MS Dousti

    29 de febrero de 2020 a las 23:22

¿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