¿Hay alguna manera de especificar cuántos caracteres de una cadena se imprimirán con printf ()?

127

¿Hay alguna manera de especificar cuántos caracteres de una cadena se imprimirán (similar a los decimales en ints)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

Me gustaría que imprima: Here are the first 8 chars: A string

TTT
fuente

Respuestas:

226

La forma básica es:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

La otra forma, a menudo más útil, es:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

Aquí, especifica la longitud como un argumento int para printf (), que trata el '*' en el formato como una solicitud para obtener la longitud de un argumento.

También puedes usar la notación:

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

Esto también es análogo a la notación "% 8.8s", pero nuevamente le permite especificar las longitudes mínima y máxima en tiempo de ejecución, de manera más realista en un escenario como:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

La especificación POSIX para printf()define estos mecanismos.

Jonathan Leffler
fuente
2
Para el último ejemplo: ¿Qué pasa si la cadena copiada es más corta que minlen?
buscador de la verdad
44
La salida se rellenará en blanco (a la izquierda, a menos que agregue a -) para completar la longitud especificada.
Jonathan Leffler
13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

% 8s especificaría un ancho mínimo de 8 caracteres. Desea truncar a las 8, así que use% .8s.

Si desea imprimir siempre exactamente 8 caracteres, puede usar% 8.8s

locura del desarrollo
fuente
13

Además de especificar una cantidad fija de caracteres, también puede usar lo *que significa que printf toma el número de caracteres de un argumento:

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

Huellas dactilares:

message: 'Hel'
message: 'Hel'
message: 'Hello'
hlovdal
fuente
11

Usando printfusted puede hacer

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

Si está usando C ++, puede lograr el mismo resultado usando el STL:

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

O, de manera menos eficiente:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;
Peter Alexander
fuente
1
Nota: no lo use ostream_iterator<char>(cout)! En cambio, ostreambuf_iterator<char>(cout)¡ usa ! La diferencia en el rendimiento debería ser bastante grande.
Dietmar Kühl
Manera más eficiente de utilizar en su lugar: std::cout.write(s.data(), 8). O en C ++ moderna, std::cout << std::string_view{s.data(), 8}.
Artyer
4

Imprima los primeros cuatro caracteres:

printf("%.4s\n", "A string that is more than 8 chars");

Consulte este enlace para obtener más información (consulte la sección .precision)

Anssi
fuente
4

En C ++ es fácil.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

EDITAR: también es más seguro usar esto con iteradores de cadena, por lo que no se escapa al final. No estoy seguro de qué sucede con printf y string que son demasiado cortos, pero supongo que esto puede ser más seguro.

Chris H
fuente
32
ja, sí, eso es "fácil". C ++ siempre parece un accidente automovilístico.
Presidente James K. Polk
todavía puedes hacer printf () en c ++ :)
StasM
66
Creo que esto fue sarcasmo. std::cout << someStr.substr(0,8);Es mucho más obvio.
MSalters
2
@MSalters Deberías publicar eso como respuesta.
Jonathan Mee el
3

printf (..... "%. 8s")

pm100
fuente
1

En C ++, lo hago de esta manera:

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

Tenga en cuenta que esto no es seguro porque al pasar el segundo argumento puedo ir más allá del tamaño de la cadena y generar una violación de acceso a la memoria. Debe implementar su propio control para evitar esto.

Rodolk
fuente