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

¿Hay alguna manera de especificar cuántos caracteres de una cadena imprimir (similar a los lugares decimales en int s)?

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

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

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); 
 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 8, entonces use% .8s.

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

Usando printf puedes 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(cout)); cout < < endl; 

O, menos eficientemente:

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

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

 #include  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' 

Imprime 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 .precision -section)

En C ++ es fácil.

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

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

printf (….. “%. 8s”)

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. Tienes que implementar tu propio cheque para evitar esto.