Respostas:
A maneira básica é:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
A outra maneira, muitas vezes mais útil, é:
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
Aqui, você especifica o comprimento como um argumento int para printf (), que trata o '*' no formato como uma solicitação para obter o comprimento de um argumento.
Você também pode usar a notação:
printf ("Here are the first 8 chars: %*.*s\n",
8, 8, "A string that is more than 8 chars");
Isso também é análogo à notação "% 8.8s", mas novamente permite especificar os comprimentos mínimo e máximo em tempo de execução - mais realisticamente em um cenário como:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
A especificação POSIX para printf()
define esses mecanismos.
-
) para compensar o comprimento especificado completo.
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
% 8s especificaria uma largura mínima de 8 caracteres. Você deseja truncar às 8, então use% .8s.
Se você quiser imprimir sempre exatamente 8 caracteres, poderá usar% 8.8s
Além de especificar uma quantidade fixa de caracteres, você também pode usar o *
que significa que printf recebe o número de caracteres de um 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;
}
Impressões:
message: 'Hel'
message: 'Hel'
message: 'Hello'
Usando printf
você pode fazer
printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Se você estiver usando C ++, poderá obter o mesmo resultado usando o 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;
Ou, com menos eficiência:
cout << "Here are the first 8 chars: " <<
string(s.begin(), s.begin() + 8) << endl;
ostream_iterator<char>(cout)
! Em vez disso, use ostreambuf_iterator<char>(cout)
! A diferença no desempenho deve ser bastante grande.
std::cout.write(s.data(), 8)
. Ou no C ++ moderno std::cout << std::string_view{s.data(), 8}
,.
Em C ++ é fácil.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
EDIT: Também é mais seguro usar isso com iteradores de string, para que você não saia do fim. Não tenho certeza do que acontece com printf e string muito curtos, mas acho que isso pode ser mais seguro.
std::cout << someStr.substr(0,8);
é muito mais óbvio.
Em C ++, faço da seguinte maneira:
char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
Observe que isso não é seguro porque, ao passar o segundo argumento, posso ir além do tamanho da string e gerar uma violação de acesso à memória. Você precisa implementar sua própria verificação para evitar isso.