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?

Foi útil?

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 ints

#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 personagem
  • snprintf retorna o número de caracteres necessários para o formato (pode ser maior que n) ou -1 Em caso de erro de codificação
  • _snprintf retorna um valor negativo se n não é grande para a corda; ou n 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top