Existe alguma alternativa setFill () para C?
-
28-09-2019 - |
Pergunta
Em C ++:
int main()
{
cout << setfill('#') << setw(10) << 5 << endl;
return 0;
}
Saídas:
#########5
Existe algum setfill()
Alternativa para C? Ou como fazer isso em C sem criar manualmente a string?
Solução
Não, não há alternativa direta.
Mas se você tem um bem-comportado snprintf
(um que se comporta conforme descrito pelo padrão C99), isso funciona sem criar uma nova string; Criando apenas 2 temporários int
s
#include <stdio.h>
int main(void) {
int filler = '#'; /* setfill('#') */
int width = 10; /* setw(10) */
int target = 5; /* 5 */
/* ******** */
int s = snprintf(NULL, 0, "%d", target);
for (int i = 0; i < width - s; i++) {
putchar(filler);
}
printf("%d\n", target);
/* ******** */
return 0;
}
Editar: versão em execução em ideone.
Edit2: diferenças entre o padrão C99 snprintf
e janelas _snprintf
(Obrigado pelo link, Ben):
- protótipo:
int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
- protótipo:
int _snprintf(char *buffer, size_t n, const char *format, ...);
snprintf
escreve não mais do que bytes (n-1) e um nu_snprintf
escreve não mais do que (n) bytes, o último dos quais pode ser nu ou outro personagemsnprintf
retorna o número de caracteres necessários para o formato (pode ser maior quen
) ou-1
Em caso de erro de codificação_snprintf
retorna um valor negativo sen
não é grande para a corda; oun
Se um byte nu não foi escrito para buffer.
Você pode executar o erro _snprintf
em um loop, aumentando n
Até você encontrar o valor certo
/* absolutely not tested, written directly on SO text editor */
int i;
size_t rightvalue = 0;
char buffer[SOME_DEFAULT_VALUE];
do {
if (sizeof buffer < rightvalue) /* OOPS, BIG BIG OOPS */;
i = _snprintf(buffer, rightvalue, "%d", 42);
} while (i != rightvalue++);
/* rightvalue already has space for the terminating NUL */
Outras dicas
int x= 5;
printf("%010d",x);
Saída: 0000000005
Agora, se você realmente deseja '#' em vez de '0', terá que substituí -los manualmente na string.
Pode ser :
char buf[11], *sp = buf;
snprintf(buf, 11, "%10d", x);
while( (sp = strchr(sp, ' ')) != '\0'){ *sp = '#'; }
puts(buf);
Todo mundo quer ligar printf
duas vezes... printf
é uma das funções mais caras do mundo.
Aqui:
char buffer[18] = "##########";
puts(buffer + snprintf(buffer+strlen(buffer), 8, "%d", 5));
Não incorporado como padrão
Eu provavelmente iria sprintf () o número em uma string e obter a contagem de caracteres e depois produzir o número correto de '#' antes de imprimir a string.
O seguinte fará isso usando memset
em c assumindo um char de 1 byte. Ele ainda cria uma 'string', embora eu não tenha certeza de como você não quer que seja.
int main(void)
{
char buf[MAX_LENGTH];
memset(buf, '#', 10);
buf[10]='\0';
printf("%s5\n", buf);
}
Dependendo do que você deseja fazer com ele, você pode criar dinamicamente o buffer para ser o tamanho apropriado e devolvê -lo de uma função auxiliar, se desejar.