Suponha que você tenha uma string que NÃO é null
terminada e você sabe seu tamanho exato, então como você pode imprimir essa string com printf
em C? Lembro-me de tal método, mas não consigo descobrir agora ...
Suponha que você tenha uma string que NÃO é null
terminada e você sabe seu tamanho exato, então como você pode imprimir essa string com printf
em C? Lembro-me de tal método, mas não consigo descobrir agora ...
Respostas:
Existe uma possibilidade com printf, é assim:
printf("%.*s", stringLength, pointerToString);
Não há necessidade de copiar nada, não há necessidade de modificar a string ou buffer original.
printf
mesmo depois de uma década ... :)
printf
imprimirá até 11 caracteres ou até encontrar NULL, o que ocorrer primeiro; no seu exemplo, NULL vem primeiro. Especificar um comprimento máximo não faz com que NULL perca seu significado de "fim de string" para printf
.
Aqui está uma explicação de como %.*s
funciona e onde é especificado.
As especificações de conversão em uma string de modelo printf têm a forma geral:
% [ param-no $] flags width [ . precision ] type conversion
ou
% [ param-no $] flags width . * [ param-no $] type conversion
A segunda forma é para obter a precisão da lista de argumentos:
Você também pode especificar uma precisão de '*'. Isso significa que o próximo argumento na lista de argumentos (antes do valor real a ser impresso) é usado como a precisão. O valor deve ser int e será ignorado se for negativo.
- Sintaxe de conversão de saída no manual glibc
Para a %s
formatação de strings, a precisão tem um significado especial:
Uma precisão pode ser especificada para indicar o número máximo de caracteres a serem escritos; caso contrário, os caracteres na string até, mas não incluindo o caractere nulo de terminação, são gravados no fluxo de saída.
- Outras conversões de saída no manual glibc
Outras variantes úteis:
"%*.*s", maxlen, maxlen, val
irá justificar à direita, inserindo espaços antes;"%-*.*s", maxlen, maxlen, val
irá justificar à esquerda."%-*.*s", padding, str_view.size(), str_view.data()
Você pode usar um fwrite () para stdout!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
Desta forma, você irá enviar os primeiros chars (número definido na variável number_of_chars) para um arquivo, neste caso para stdout (a saída padrão, sua tela)!
printf("%.*s", length, string)
não funciona.
Isso significa imprimir até bytes de comprimento OU um byte nulo, o que ocorrer primeiro. Se o array-of-char com terminação não nula contiver bytes nulos ANTES do comprimento, printf irá parar neles e não continuará.
#include<string.h>
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
int i;
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
Eu editei o código, aqui está outra maneira:
#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/
return 0;
}
C
contexto, todas as strings têm terminação nula. Arrays de char sem um nulo neles não são strings ... são arrays de char :)