Existe uma maneira de especificar quantos caracteres de uma string imprimir usando printf ()?

127

Existe uma maneira de especificar quantos caracteres de uma sequência a serem impressos (semelhantes às casas decimais em ints)?

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

Deseja imprimir: Here are the first 8 chars: A string

TTT
fonte

Respostas:

226

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.

Jonathan Leffler
fonte
2
Para o último exemplo: E se a sequência copiada for menor que minlen?
truthseeker
4
A saída será preenchida em branco (à esquerda, a menos que você adicione a -) para compensar o comprimento especificado completo.
Jonathan Leffler
13
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

desenvolvimento
fonte
13

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'
hlovdal
fonte
11

Usando printfvocê 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;
Peter Alexander
fonte
1
Nota: não use ostream_iterator<char>(cout)! Em vez disso, use ostreambuf_iterator<char>(cout)! A diferença no desempenho deve ser bastante grande.
Dietmar Kühl
Maneira mais eficiente para usar em vez disso: std::cout.write(s.data(), 8). Ou no C ++ moderno std::cout << std::string_view{s.data(), 8},.
Artyer 20/07
4

Imprima os quatro primeiros caracteres:

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

Consulte este link para obter mais informações (consulte a seção .precision)

Anssi
fonte
4

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.

Chris H
fonte
32
ha, sim, isso é "fácil". C ++ sempre parece acidente de carro.
Presidente James K. Polk
você ainda pode fazer printf () em c ++ :)
StasM
6
Eu acho que isso foi sarcasmo. std::cout << someStr.substr(0,8);é muito mais óbvio.
MSalters
2
@MSalters Você deve postar isso como resposta.
Jonathan Mee 12/01
3

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

pm100
fonte
1

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.

Rodolk
fonte