2010-02-10 9 views

Respuesta

135

La forma básica es:

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

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

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

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

También puede utilizar 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 al "8%.8s notación", pero de nuevo le permite especificar la longitud 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); 
+2

Hasta el último ejemplo: ¿Qué pasa si la cadena copiada es más corta que minlen? – truthseeker

+3

La salida estará acolchada en blanco (a la izquierda a menos que agregue un '-') para completarla hasta la longitud especificada completa. –

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

% 8s se especifique un ancho mínimo de 8 caracteres (..... "% 8s."). Desea truncar a 8, entonces use% .8s.

Si desea imprimir siempre exactamente 8 caracteres que puede utilizar% 8.8s

2

En C++ es fácil.

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

EDIT: También es más seguro de usar esto con iteradores cadena, por lo que no se quede fuera de la final. No estoy seguro de qué pasa con printf y string que son demasiado cortos, pero supongo que esto puede ser más seguro.

+20

ha, sí, eso es "fácil". C++ siempre parece un accidente automovilístico. –

+0

todavía puede hacer printf() en C++ :) – StasM

+6

Creo que esto fue sarcasmo. 'std :: cout << someStr.substr (0,8);' es mucho más obvio. – MSalters

7

Usando printf que puede hacer

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

Si estás usando C++ , se puede lograr el mismo resultado utilizando el TEL:

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, menos eficiente:

cout << "Here are the first 8 chars: " << 
     string(s.begin(), s.begin() + 8) << endl; 
+0

Nota: no ** no ** use 'ostream_iterator (cout)'! En su lugar, use 'ostreambuf_iterator (cout)'! La diferencia en el rendimiento debería ser bastante grande. –

4

Además de especificar una cantidad fija de caracteres, también se puede utilizar * 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; 
} 

Prints:

message: 'Hel' 
message: 'Hel' 
message: 'Hello' 
3

Imprimir primeros cuatro caracteres:

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

Ver this link para obtener más información (marque .precision -section)

0

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 que puedo ir más allá del tamaño de la cadena y genera una violación de acceso a la memoria. Tienes que implementar tu propio cheque para evitar esto.

Cuestiones relacionadas